Servlet
来源:互联网 发布:国内最好数据恢复公司 编辑:程序博客网 时间:2024/06/15 09:06
Servlet
sf2gis@163.com
2015年7月9日
2015年7月21日增加Annotation配置
2015年8月28日重构
2015年9月4日添加servlet注记、实现
1 目标:标准的服务器端处理程序,与容器交互,处理各种协议的请求,并返回通用的响应。
2 原理:抽象的接口规范,生成服务器框架。根据具体协议(当前只有HTTP),产生具体的实现。
由Java提出规范。由Tomcat等实现方案。并提供部分常用实现类。
3 方法:Servlet规范:独立于容器的WEB应用的组织标准
目标:将Web应用与具体的服务器解耦,可以被所有实现规范的容器所使用。
原理:servlet规范规定所有的内容按照固定的目录存放。
流程:url请求发送到容器,容器调用servlet生成实例。
方法:
局部配置在当前应用下的WEB-INF(web information)中,全局配置在Tomcat的conf目录下
3.1 目录组织:配置文件web.xml、类classes、库lib等。
配置文件:web-inf/web.xml或注记。注意,不要重复设置同一个servlet。
servlet类.class:web-inf/classes。
servlet类使用的jar库:web-inf/lib。
其它文件应放在webapp的子目录中。
3.2 web配置:web.xml,注记
目标:配置与web服务相关的所有信息,是容器的配置入口。
原理:容器查找web.xml或注记,根据url实例化servlet类,并调用接口中的方法。
方法:使用web.xml描述。由于管理内容过多,可能导致可读性降低,现逐渐使用annotation解耦配置内容。
servlet使用名称作为标识。
3.2.1首页列表:web.xml中的webcome-file-list标签
<welcome-file-list>
<welcome-file>index.html </welcome-file>
…
</welcome-file-list>
3.2.2元数据:配置servlet容器相关参数
是否启用注记:metadata-complete,如果为true,表示本xml完全配置,不启用注记。
3.2.3servlet映射:请求的URL与业务servlet映射
3.2.3.1 请求url与servlet映射:<servlet-mapping>
<servlet-mapping>
<servlet-name>名称标识</servlet-name>
<url-pattern>请求url匹配模式</urlpattern>
</servlet-mapping>
3.2.3.2 Servlet属性:<servlet>的名称和实现类
<servlet>
<servlet-name>名称标识</servlet-name>
<servlet-class>具体的类名</servlet-calss>
</servlet>
3.2.3.3 servlet实现类
业务类:com.thbd.TestServlet
package com.thbd;
import java.io.IOException;
import java.io.PrintWriter;
importjavax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestServlet
*/
@WebServlet("/TestServlet")
public class TestServletextends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public TestServlet() {
// TODO Auto-generated constructor stub
}
/**
* @seeHttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter pw=response.getWriter();
pw.println("<h1>Hello,I amServlet.</h1>");
}
/**
* @seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
3.2.3.4 示例
<?xmlversion="1.0" encoding="ISO-8859-1"?>
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<description>
Servlet and JSP Examples.
</description>
<display-name>Servlet and JSPExamples</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.thbd.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
</web-app>
3.2.4 注记配置:annotation
目标:由于配置文件在大型应用中过于膨胀,可读性降低,耦合度过高,现在逐渐使用注记代替部分配置文件内容。
原理:容器检查注记,与web.xml一样。
当前配置文件可以完全实现annotation的所有功能,两者能够一一映射。
方法:标记为servlet:@WebServlet
设置属性名称:servlet-name,urlPatterns或者value,name等。
url配置模式使用urlPatterns或者values指定。可以指定一个或多个。
@WebServlet(name="TestServlet",urlPatterns="/TestServlet")
@WebServlet(name="TestServlet",urlPatterns={"/TestServlet",”/ts”})
参考:http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html
@WebServlet(name="TestServlet",urlPatterns="/TestServlet")
等价于:
<!--
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.thbd.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
-->
示例1:注记配置Servlet
Web.xml
<?xmlversion="1.0" encoding="GBK"?>
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="false">
</web-app>
ServletTest.java
package lee;
import java.io.IOException;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletTest
*/
@WebServlet(
description = "this is a servelt test withannotation",
urlPatterns = { "/ServletTest01" },
initParams = {
@WebInitParam(name = "name", value = "lixx12",description = "name of the person"),
@WebInitParam(name= "age", value = "16", description = "age of theperson")
})
public class ServletTestextends HttpServlet {
private static final long serialVersionUID = 1L;
private String name;
private int age;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletTest() {
super();
// TODO Auto-generated constructor stub
}
/**
* @seeHttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletConfig config=getServletConfig();
this.name=config.getInitParameter("name");
this.age=Integer.parseInt(config.getInitParameter("age"));
System.out.println("Hello,Annotation!");
System.out.println("name="+name+",age="+age);
}
}
示例2:注记配置Servlet
//web.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="false">
<description>
Servlet and JSP Examples.
</description>
<display-name>Servlet and JSPExamples</display-name>
</web-app>
//TestServlet.java
package com.thbd;
import java.io.IOException;
import java.io.PrintWriter;
importjavax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestServlet
*/
@WebServlet(urlPatterns={"/TestServlet",”/ts”})
public class TestServletextends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public TestServlet() {
// TODO Auto-generated constructor stub
}
/**
* @seeHttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter pw=response.getWriter();
pw.println("<h1>Hello,I amServlet.</h1>");
}
/**
* @seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
3.2.5初始化实例生成:load-on-startup,xml或注记。
1时应用启动就生成实例,默认为第一次请求时生成实例,此值越小,则越早实例化。
3.3 服务实现:Servlet接口,初始化init(),服务service(),释放destroy()。
目标:响应http请求。
原理:响应get,post,put,delete等http标准请求。但通常只能get、post两种,而且两者一般执行相同的功能。因此一般使用service()作为实际的功能被各个响应函数调用(do*())。
所有相关的类和库都要分别放在classes和lib目录下。
方法:初始化init()(由构造函数调用),服务service()(由各个响应函数调用),释放destroy()(由析构函数调用)。
Init()和destroy()一般不会重写,通常只需要重写service()。
3.4 控制器:接收请求,处理请求,调用bean,返回结果。
作为前端请求和后端处理库的中间件,并将结果返回给前端。
4 方法:Servlet规范的实现。
参考:http://blog.csdn.net/xtu_xiaoxin/article/details/8464808
http://blog.csdn.net/xtu_xiaoxin/article/details/8468629
http://www.cnblogs.com/xieduo/articles/822091.html
4.1 与容器交互:servletConfig,容器根据配置内容,生成每个servlet的配置对象(包括名称,实例化类名,参数等),并以此进行servlet的初始化。
此接口保证了容器和servlet的解耦。
4.2 请求:servletRequest,请求的所有信息。
4.3 响应:servletResponse,响应的所有信息。
4.4 处理服务:servlet,管理服务的生命周期(初始化,服务,析构)。
初始化:init(),容器启动时调用,初始化一次,从而可以提供服务。
服务:根据请求,调用相关服务。
析构:当web应用终止时,析构。
4.5 基本实现:GenericServlet,servlet接口的具体实现,组织各种相关资源。
4.6 HTTP协议实现:HttpServlet,根据HTTP协议,实现和扩展servlet。
包括HTTP协议中的doGet(),doPut(),doPost()等。
5 方法:Annotation配置方法(servlet3.0+tomcat)
目标:减化xml配置的辅助手段,对于不太容易变化的部分添加到源程序中。
增加可读性,减少开发周期,减少维护难度,增加配置自动检测。
5.1 原理:Annotation作为一种元数据,可以在运行时由JVM解释。也可以自定义解析方法,根据源代码的注解,自动配置。配置更加简单,但全局配置变得隐含。
注意:由于注解在源代码中集成,导致配置与源码耦合,因此仅限于将不易改变的内容使用注解配置(无法在部署环境中配置)。xml配置仍然为基本的解耦方式(但是太多了不好维护,只能将不易改变的直接集成到源码)。但是这种造成一个问题,结果不清晰。无法直接在运行环境通过配置文件获得或改变配置。
参考:https://en.wikipedia.org/wiki/Convention_over_configuration
http://www.quora.com/XML-vs-annotations-which-is-better-in-Spring-Why
http://stackoverflow.com/questions/17086421/annotations-vs-xml-advantages-and-disadvantages
http://stackoverflow.com/questions/182393/xml-configuration-versus-annotation-based-configuration
5.2 方法:servlet,filter,listener
参考:http://blog.csdn.net/xiazdong/article/details/7208316
5.2.1启用Annotation配置:使用servlet3.0规范,开启xml非完全配置模式。
servlet3.0规范才能使用Annotation配置servlet,需要web.xml说明。
3.0规范增加metadata-complete属性说明xml是否是完全配置文件,默认为false,将搜索Annotation,如果设置为true,将只使用xml配置。
参考:http://www.oschina.net/question/133505_111261
http://stackoverflow.com/questions/9820379/what-to-do-with-annotations-after-setting-metadata-complete-true-which-resolv
示例:
<?xmlversion="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="false">
<description>
Servlet and JSP Examples.
</description>
<display-name>Servlet and JSPExamples</display-name>
</web-app>
5.2.2配置Servlet:@WebServlet,名称name,url模式urlpatterns等。
参见:注记配置:annotation
5.2.3初始化参数:@WebInitParam(name=xx,value=xx)
目标:配置servlet或filter等注记的初始化参数。
方法:不能独立使用,需要在父注记的初始化标记中设置。
示例:
@WebFilter(urlPatterns="/*",
initParams={@WebInitParam(name="init1",value="i111"),
@WebInitParam(name="init2",value="i222")})
5.2.4配置Filter:@WebFilter。
参见:方法:过滤器Filter
5.2.5配置Listener:@WebListener。
参考:方法:监听器Listener
5.2.6配置多媒体上传:@MultipartConfig
参见:方法:文件上传
5.2.7配置安全性:@ServletSecurity,@HttpConstraint,@HttpMethodConstraint。
6 方法:文件上传
参见:Servlet-文件上传MultipartConfig_Part.docx
7 方法:过滤器Filter
参见:Servlet-过滤器Filter.docx
8 方法:监听器Listener
参见:Servlet-监听器Listener.docx
9 方法:模块化开发:web fragment
参见:Servlet-模块化开发.docx
10 方法:异步执行:Async
参见:Servlet-异步执行AsyncContext.docx
- Servlet
- servlet
- Servlet
- servlet
- Servlet
- servlet
- servlet
- Servlet
- Servlet
- servlet
- Servlet
- servlet
- servlet
- servlet
- Servlet
- servlet
- servlet
- servlet
- inception安装步骤---自己整理的安装步骤
- Android 适用各种布局的loading加载框
- Java 多线程同步的五种方法
- 简单的访问计数器
- poj2406Power Strings(DC3)
- Servlet
- AC自动机算法
- ora-600[6002]解决
- hdu 1026 Ignatius and the Princess I bfs 优先队列 路径记录
- 代码洁癖症的表现
- 软工视频和文档大杂烩(二)
- 程序员转型产品经理真的明智吗?
- 机器学习温和指南
- 搜索引擎原理