Servlet是运行在Web服务器或应用服务器上的程序,它是违来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以手机来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Servlet主要功能:
- 读取客户端发送的显式数据,包括HTML表单,或者也可以是其他HTTP客户端程序的表单
- 读取客户端发送隐式HTTP请求数据,包括cookie、媒体类型和浏览器能理解的格式等
- 处理数据并生成结果
- 发送显式数据到客户端
- 发送隐式的HTTP响应到客户端
Servlet生命周期:
- Servlet通过调用init()方法进行初始化
- 调用service()方法处理客户端请求
- 通过调用destroy()方法终止
- 由JVM的垃圾回收器进行垃圾回收
请求/响应的基本流程:
- 客户端对Web容器发出HTTP请求
- HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建对象
- Web容器由请求的URL决定要使用哪个Servlet来处理请求
- Servlet根据请求对象的信息决定如何处理,通过响应对象来创建响应
- Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端
注:Web服务器可能会使用同一个Servlet实例响应多个请求,多个请求下,相当于同一个线程共享存取一个对象,要特别注意线程安全问题。
Servlet创建对象时机
- 客户端第一次请求某个Servlet时,系统创建该Servlet的实例
- Web应用启动时立即创建Servlet,即load-on-startup Servlet,load-on-startup只接收一个整数值,数值越小,越优先实例化。
MVC:
- Model 模型 接受控制器的请求调用,负责处理业务逻辑、负责数据存取逻辑等
- View 视图
- Controller 控制器 取得请求参数、验证请求参数、转发请求给模型、转发请求给画面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应内容类型器 response.setContentType("text/html;charset=UTF-8"); //取得响应输出对象 PrintWriter out = response.getWriter(); //获取请求参数 String name = request.getParameter("name"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello First Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>" + "hello" + name + "</h1>"); out.println("</body>"); out.println("</html>"); }
在浏览器地址栏输入http://localhost:8080/FirstServlethehe/HelloFirstServlet?name=java就可以得到页面
HTTPServlet的service方法流程:
String method = req.getMethod(); if(method.equals(METHOD_GET)){ doGet(req, resp); }else if(method.equals(METHOD_POST)){ doPost(req, resp); }else if(method.equals(METHOD_HEAD)){ doHead(req, resp); }else if(method.equals(METHOD_PUT)){ doPut(req, resp); }
doGet()方法和doPost()方法:
-
GET请求跟随在URL之后的请求参数长度有限,过长的请求参数,或如文件上传这类大量数据,不适合GET请求,应该改用POST请求
-
GET请求参数会出现在地址栏上,敏感性或有安全考虑的请求参数不应该使用GET请求
-
POST请求参数不会出现在地址栏上,所以无法加入浏览器的书签中
-
有些浏览器会依网址缓存数据,如果网址是相同的URL,则会直接从浏览器缓存中取出数据,而不会真正发送请求到服务器上查询最新的结果。如果不希望服务器状态改变了,而浏览器仍从缓存中取得旧的资料,则使用POST请求(使用GET也可以避免缓存,比如在网址上附加时间戳,让每次GET请求网址不同)
-
GET请求应该用于等幂操作。GET请求纯粹取得资源,而不改变服务器上的数据或状态。
-
POST请求应用于非等幂操作。POST请求发送的数据可能会影响到服务器上的数据或状态
使用注解配置
@WebServlet( asyncSupported //boolean 指定Servlet是否支持异步操作模式 name="Three", //String 这个Servlet的名称是Three //可以指定,也可以不指定,指定了可以通过getServletName()方法获得,没有指定则是Servlet的完整类名 urlPatterns = {"/ThreeServlet"}, //客户端请求的URL是/ThreeServlet //可以配置多个映射,配置了多个映射代表不同的地址信息指向同一个文件 displayName = "thrid", //指定Servlet显示名称 initParams = { //配置初始化数据 @WebInitParam(name = "name", value = "Three") }, loadOnStartup = 1) //标记容器是否在应用启动时就加载这个Servlet //0或正数表示启动应用就加载,数字越小,加载Servlet的优先级就越高
//注解配置多个映射: @WebServlet(urlPatterns = {"/HelloFirstServlet.view", "/helloSecondServlet.view" }) //默认第一个地址
如果在web.xml配置中指定metadata-complete="true",则注解无效
<web-app> <metadata-complete>true</metadata-complete> </web-app>
使用web.xml配置
<web-app> <servlet> <servlet-name><servlet-name> <servlet-class><servlet-class> <init-param> <param-name></param-name> <param-value></param-value> </init-param> <load-on-startup></load-on-startup> </servlet> <servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping> <web-app>
获得配置参数
ServletConfig config = getServletConfig(); out.println("initParams : " + config.getInitParameter("initFirst")); out.println("<br/>"); out.println("initParamSecond : " + this.getInitParameter("initSecond"));
web.xml其他标签
1.<web-app></web-app> <web-app></web-app>是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。 2.<display-name></display-name> <display-name></display-name>定义web应用的名称。如<display-name>trk-order-rest</display-name> 3.<distributable/> <distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。 4.<context-param></context-param> <context-param>元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。<param-name>子元素包含有参数名,而<param-value>子元素包含的是参数值。作为选择,可用<description>子元素来描述参数。 5.<session-config></session-config> 设置容器的session参数,<session-timeout>指定session的失效时间(默认30分钟),<session-timeout>值必须为整数,为0或负数,表示会话永远不会超时 6.<filter></filter> 预处理 7.<listener></listener> 监听器
使用web.xml会覆盖注解配置信息。
从Servlet 3.0新特性,通过web-fragment.xml可以将项目拆分为多个项目,解耦合,使其在项目中开发效率提高
创建web fragment project
web-fragment.xml配置信息:
<web-fragment id="WebFragment_ID" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_1.xsd"> <display-name>Test</display-name> <name>fragmentname</name> <listener> <!-- 配置一个监听器 --> <listener-class>myListenner.DEMO1</listener-class> </listener> <!-- 表示一个执行序列 --> <ordering> <!-- 表示在项目所有之前进行初始化 --> <before><others/></before> </ordering> </web-fragment>
在web.xml中配置,使用<absolute-ordering>定义绝对顺序:
<absolute-ordering> <name>fragmentname</name> ... </absolute-ordering>

浙公网安备 33010602011771号