首页 > 代码库 > web开发技术中Servlet技术的概述
web开发技术中Servlet技术的概述
1.servlet是什么:
servlet是一个位于服务器端的java应用程序
它可以像jsp一样,直接输出信息
servlet类必须继承HttpServlet类,否则,不能称为serlvet
servlet类是一个java类,但是有自己的规则
servlet必须在web.xml文件中注册
服务器在启动的时候,可以根据这些配置来加载servlet类.......
2.servlet作用:
C:控制层
serlvet主要用来做控制转发,需要结合到MVC模式(套路)
3.servlet生命周期:
init
service
destroy
/*** Initialization of the servlet. <br>** @throws ServletException if an error occure* 在servlet被第一次访问时,本方法将会被自动调用* 本方法被称为初始化方法* 只会被调用一次*/public void init() throws ServletException {// Put your code hereSystem.out.println("我是init方法");}
/**
* 具体的业务方法
* 该方法将会被调用多次
* 每次访问servlet时,该方法都会被调用
* service根据request.getMethod得到你的提交方式,然后由它来决定对doGet.doPost的调用
*/
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
super.service(request, response);
System.out.println("我是service.....................................");
}
/**
* Destruction of the servlet. <br>
* servlet被注销的时候
* 本方法为销毁方法
* 也只是被服务器自动调用一次
*
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("destroy方法被调用..............");
}
4.定义servlet的必需的步骤
A.定义一个类,继承HttpServlet
B.重写doGet和doPost方法
C.实现doGet和doPost的逻辑
D.在web.xml部署描述文件中定义servlet的映射方式
5.为web应用设置一个欢迎页面
<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>
如果第一个页面找不到,会依次向下找
6.request和其他类的关系
HttpSession session = request.getSession();session.setAttribute("username", "scott");ServletContext application = this.getServletContext();application.setAttribute("userlist", null);RequestDispatcher rd = request.getRequestDispatcher("C.jsp");rd.forward(request, response);
7,在servlet中使用session
HttpSession ss = request.getSession();List list=new ArrayList();list.add("SMITH");list.add("ALLEN");ss.setAttribute("userlist", list);
8.关于servlet的使用方式
servlet可以像jsp一样被访问
A.在地址栏内可以直接输入地址来访问
http://localhost:8088/myproject15/servlet/CServlet
B.超链接方式
<a href="http://www.mamicode.com/servlet/CServlet?username=zhangshan&pwd=123456789">链接</a>
C.include或者forward标签
<jsp:forward page="servlet/CServlet?username=wangwu&pwd=123456"></jsp:forward>
D.javascript转向
<input type="button" value="http://www.mamicode.com/点击"
onclick="location.replace(‘servlet/CServlet?username=abcd&pwd=123‘);">
E.response转向
9,在web服务器中配置errorpage
<error-page><error-code>500</error-code><location>/index.html</location></error-page><error-page><exception-type>java.lang.NullPointerException</exception-type><location>/index.html</location></error-page>
10.关于session-config的配置
<session-config><session-timeout>1</session-timeout></session-config>
超时时间单位为分钟
11.为servlet定义初始化参数
使用getInitParameter()方法来提取servlet的初始化参数
定义:
<servlet><servlet-name>a</servlet-name><servlet-class>com.sun.demo.MyServlet</servlet-class><init-param><param-name>type</param-name><param-value>text/html;charset=GBK</param-value></init-param></servlet>
提取方式:
String str = this.getInitParameter("type");
12.过滤器:
在到达目标页面之前,所处理的动作
作用:
权限的校验
日志记录
图片的转换
数据的加密
等等.
实现步骤:
1).实现Filter接口
2).实现doFilter方法
3).传递过滤链,放请求过去
4).在web.xml文件中注册过滤器
13.监听器
靠事件来触发的,比如application执行了setAttribute();
步骤
两步:
A.实现listener接口,说出你想要做什么
B.在web.xml文件中注册这个监听器
14.字符集转换的问题
分几类情况
A.如果页面中使用jsp:include或jsp:forward关系,中文字符集转换:
request.setCharacterEncoding("GBK");
B.在servlet中显示中文:
由于无法使用jsp页面中的编码指令
<%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>
那么在servlet中设置输出编码就应该通过:
response.setContentType("text/html;charset=GBK");
C.普通的参数传递
普通的参数也需要考虑到中文的问题
除了页面显示设置 contentType="text/html;charset=GBK"之外,我们还需要对中文字符进行字符转换硬编码
超链接:
String str = request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");
form表单:
String str= request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");
javascript转向:
String str = request.getParameter("username");
str = new String(str.getBytes("ISO8859-1"),"gbk");
response方式转向:
String message = "我的中文测试";
response.sendRedirect("L.jsp?message="+URLEncoder.encode(message));
接收页面:
String message = request.getParameter("message");
message = new String(message.getBytes("ISO8859-1"),"GBK");
request等作用域
request.setAttribute("username","我的测试名称");
session.setAttribute("passwd","我的密码");
不需要进行转换
15.编写线程安全的servlet
java线程共享数据的概念
多线程使用的数据是共享的
boolean shutdown = true;/*** 线程体*/public void run() {// TODO Auto-generated method stubint i = 0;while (1 == 1) {i++;System.out.println(Thread.currentThread().getName()+"="+i);if (shutdown == false) {break;}}System.out.println("本线程结束!");}
servlet本身建立在多线程的基础上,所以对于全局变量也存在"共享数据"的问题.
在servlet中定义一个全局变量,该数据将会被多个线程"共享",
String username;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();username = request.getParameter("username");//张三try {Thread.sleep(1000*6);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}out.println(username);out.close();}
如果同时提交两个请求:
http://localhost:8088/myproject19/servlet/AServlet?username=zhangshan
http://localhost:8088/myproject19/servlet/AServlet?username=smith
则:
两个结果都将显示为smith
这是因为第一个在访问时,得到了zhangshan的值,后来,username的值被赋为smith
又因为username是被多个线程所共享的,所以,所有请求里面的username都变成了smith
避免使用全局变量
方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全
16.怎么样自动加载servlet
我们知道,servlet有一个生命周期方法,init,service,destroy,其中init在servlet第一次访问的时候访问,它只能被访问一次.
如果你需要在服务器启动时,让servlet自动启动,你可以通过load-on-startup来实现,这一点,我们可以通过init方法被调用来观察出来
load-on-startup是web.xml文件中servlet的配置节点
描述我们的场景:
假如你有这样一个需求:
为提高系统性能,在服务器启动时,从数据库中查询所有的用户名列表,以便在其他页面中可以直接使用,而不需要从数据库再进行查询,如何实现?
A.ServletContextListener可以在服务器启动时自动执行其方法
B.可以使用一个servlet,然后定义load-on-startup,让它能够在服务器启动时自动执行其方法
使用<load-on-startup>1</load-on-startup>可以指定服务器加载顺序
实例代码:
/*** Initialization of the servlet. <br>** @throws ServletException if an error occure* 本方法在servlet被加载时访问* 这里,我们在服务器启动,自动加载一段数据,起到数据缓存的效果*/public void init() throws ServletException {// Put your code hereList<String> list = new ArrayList<String>();list.add("WARD");list.add("JONES");list.add("JAMES");this.getServletContext().setAttribute("datalist",list);}
配置文件设置:
<servlet><servlet-name>DataCacheServlet</servlet-name><servlet-class>com.sun.demo.DataCacheServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>
后记:每一天,每一动作,我们所尝试过经历过的,都是辽阔夜空里微微闪烁的星光,即使微茫,
也有人站在某个角落用闪烁的眸光与你辉映!
web开发技术中Servlet技术的概述