Servlet是什么:
运行在web服务器和引用服务器上的程序,它是一个中间层,处于web浏览器或者其他http
客户端的请求,和http服务器上的数据库或应用程序直接的中间层.
Servlet生命周期:从创建到毁灭的过程
init()初始化
只调用一次,它在servlet第一次创建的时候被调用,在后续每次用户请求时不再调用
servlet创建与用户的第一次调用对应的URL,但是您可以指定servlet在服务器第一次启动的时候
被加载.当用户调用一个servlet时,就会创建一个servlet实例,每次请求都会产生一个新的线程,
适当的时候移交给doGet和doPost,init简单的创建和加载一些数据没,这些数据会用户servlet的
整个生命周期.
public void init() throws ServletException{ //初始化代码 }
service()处理客户端的请求
是执行实际任务的主要方法. Servlet容器(即web服务器)调用service()方法来处理来自客户端的
请求并格式化响应写回客户端. 每次服务器接收到一个servlet请求,服务器就会产生一个新的
线程并调用服务,service()方法,检查http请求(GET,POST,PUT,DELETE等),并在适当的时候调用
doGet,doPost,doPut,doDelete等方法.
service方法由容器调用,适当的时候调用doGet等方法,所以你不必做任何操作,只需要重写doGet
和doPost方法.
doGet():处理来自URL的一个正常请求,或者来自一个为指定的method的html表单,get方法有参数
限制请求字符串中最多包含1024个字符.
doPost():请求来自一个特定指定了METHOD为post的HTML表单
destroy()终止
只会调用一次,在Servlet生命周期结束时被调用,destroy()调用后会被java回收.
最后.servlet是由jvm的垃圾回收器进行垃圾回收的.
Servlet实例:HelloWorld示例代码
public class HelloWorld extends HttpServlet{
private String message;
public void init() throws ServletException{
//初始化servlet中的必须的参数
message = "Hello world";
}
public void doGet(HttpServletRequest request,
HttpServletResonse response) throws ServletException,IoException{
//设置响应内容类型
response.setContentType("text/html");
//实际的逻辑是在这里
PrintWrite out = response.getWriter();
out.println("<h1>" + message + "</h1>")
}
public void destroy(){}
}
Servlet部署:
1.将HelloWorld.java文件编译后移到tomcat中的/webapps/ROOT/WEB-INF/classes
2>在/webapps/ROOT/WEB-INF/中的web.xml文件中配置
<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
<servlet-mapping>
</web-app>
使用servlet读取表单数据:
getParameter():调用request.getParameter()方法获得参数值 request.getParameter("name")
getParameterValues():如果参数值出现一次一上调用该方法,返回多个值,request.getParameterValues(paramName);
getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。Enumeration paramNames = request.getParameterNames();i
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
Servlet编写过滤器:
Servlet过滤器可以动态拦截请求和响应,以变换或使用包含在请求或响应中的信息.
可以将一个或多个servlet过滤器附加到一个servlet或一组servlet,
Servlet过滤器是可用于Servlet变成的java类,可以实现一下目的:
1:在客户端的请求访问后端资源之前,拦截这些请求
2:在服务器的响应发送回客户端之前,处理这些响应.
根据规范建议的各种类型的过滤器:
可以查看: http://www.runoob.com/servlet/servlet-writing-filters.html
过滤器通过web部署描述符(web.xml)中的xml标签来声明,然后映射到您的应用程序的
部署描述中的Servlet名称或URL模式中.当web容器启动web应用程序时,它会为你在
部署描述中声明的没一个过滤器创建一个实例. Filter的执行顺序与web.xml配置
文件中的顺序一致,一般全部都在所有servlet之前.
Servlet过滤器的方法,过滤器继承javax.servlet.Filter接口的java类.其中有3个方法.
init(FilterConfig filterConfig):相当与servlet中的init方法.可以读取web.xml
配置,完成对象的初始化, 服务器启动时创建过滤对象.
doFilter(ServletRequest,ServletResponse,FilterChain):该方法完成实际的过滤
过程,当客户端请求方法与过滤器设置匹配的URL时,servlet容器将先调用
doFilter方法,FilterChain用户访问后续过滤器.
destroy():销毁,过滤器占用的资源,.
FilterConfig的使用: init方法中使用:
web.xml配置:<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.tian.LogFilter</filter-class>
<init-param>
<param-name>site</param-name>
<param-value>菜鸟编程</param-value>
</init-param>
</filter>
init方法:
public void init(FilterConfig filterConfig) throws ServletException{
String site = filterConfig.getInitParameter("site");
}
doFilter()方法;
publc void doFilter(ServletRequest re,ServletResponse res,FilterChain chain){
//处理各种请求和响应.
chain.doFilter(re,res);//将请求传回过滤链
}
filter的访问也是按照配置顺序, <servlet-mapping>的顺序.
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml配置节点说明:
<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDEFORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
Servlet线程安全问题:
每次客户端访问servlet web服务器都会为每个请求创建一个线程,这就会引起线程安全问题,(servlet只会在第一次被请求时创建一个实例,
多个请求就是多个线程同时访问一个实例,就会有线程安全问题,)
1:我们可以为执行的方法加锁:
eg: public void doGet(HttpServletRequest re , HttpServletResonse res){
synchronized(this){ //为对象加锁,保证任何时候都只有一个线程在访问servlet里面的对象.
i++;
}
}
注:这个方法虽然可以解决线程安全,Servlet请求必须排队执行,当9999个人一起访问的时候这个方案不可能使用,
2:sun公司提供的解决方案让servlet去实现一个SingleThreadModel接口,实现这个接口,Servlet引擎就会以单线程模式来调用service方法.
说明:实现SingleThreadModel几口,Servlet引擎仍然支持
Servlet
最新推荐文章于 2023-01-14 08:55:37 发布