Servlet工作流程Demo

来源:互联网 发布:lamp python 编辑:程序博客网 时间:2024/05/01 18:47

在学习Java框架的同时,不能忘了基础。基础打好了,也有助于对框架的理解和运用。

Http访问的大致流程:

1、浏览器提交遵循Http协议的请求文本。

2、请求由服务器(比如Tomcat)接收并解析,封装成HttpServletRequest类型的requset对象。

3、Web容器决定选择URL对应的Servlet处理业务逻辑,如读取数据库等。

4、Tomcat把输出流封装为HttpServletResponse类型的response对象。通过控制response的属性,就可以控制输出内容。

5、浏览器根据收到的结果显示响应内容。

从这个流程我们可以发现,Servlet是JavaWeb的核心程序,所有的请求最终都交给Servlet来处理。


下面通过一个TestServlet小Demo,复习一下Servlet的工作流程。

1、在Eclipse中新建一个名为TestServlet的Dynamic Web Project。

2、在src目录下新建名为Test Servlet的Servlet,不妨设包名为com.demo.

TestServlet.java代码如下:

package com.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class TestServlet */@WebServlet("/TestServlet")public class TestServlet extends HttpServlet {// 继承HttpServletprivate static final long serialVersionUID = 1L;           /**     * @see HttpServlet#HttpServlet()     */    public TestServlet() {        super();    }/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.log("execute doGet method...");this.execute(request, response);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.log("execute doPost method...");this.execute(request, response);}private void execute(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{response.setCharacterEncoding("UTF-8");request.setCharacterEncoding("UTF-8");String requestURI =request.getRequestURI();String method = request.getMethod();String param = request.getParameter("param");response.setContentType("text/html");PrintWriter out = response.getWriter();//获取响应输出对象out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("</head>");out.println("<body>");out.println("<h2>通过 "+ method+ " 方式访问页面,参数为:"+ param +"</h2>");out.println("<br/>");out.println("<form action= '"+ requestURI +"' method='get'>"+ " <input type='text' name='param' value='get param' > <input type='submit' value='GET方式提交页面"+ requestURI +"'></form>");out.println("<br/>");out.println("<form action= '"+ requestURI +"' method='post'> "+ " <input type='text' name='param' value='post param' > <input type='submit' value='POST方式提交页面"+ requestURI +"'></form>");out.println("<br/>");out.println("<script> document.write('update time:'+document.lastModified) </script>");out.println("</body>");out.println("</html>");out.flush();out.close();}}

从代码中可以看到,doGet和doPost分别响应GET请求和POST请求,这里我们回顾一下GET和POST的区别

1、get是从服务器上获取数据,post是向服务器传送数据。

2、get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3、对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5、get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 

建议:1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式。2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式。


3、在TestServlet.java上右击选择Run As | Run On Server;服务器我用的是Tomcat7.0

4、在Eclipse内置浏览器可以看到如下内容


注:在TestServlet.java中用到了@WebServlet注解,其作用是告诉Web容器,如果请求的URL是“TestServlet”,则由TestServlet的实例来响应。

使用注解来定义Servlet是Servlet3.0以后的功能。更一般的我们是通过在WEB-INF目录下的web.xml文件来定义Servlet。

5、使用web.xml配置Servlet。

web.xml是部署描述文件,一般放在WEB-INF目录下,可以配置很多东西。这个Demo功能简单,我在这里只是简单配置一下TestServlet。

web.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" 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_2_5.xsd"><servlet><servlet-name>testServlet</servlet-name><servlet-class>com.demo.TestServlet</servlet-class></servlet><servlet-mapping><servlet-name>testServlet</servlet-name><url-pattern>/test</url-pattern></servlet-mapping></web-app>
6、配置好后,右击选择Run As | Run On Server,运行项目,可以得到如下页面。


注意:为了便于区别,web.xml中url-patter设为了test。此时若用同第四步中的以/TestServlet/TestServlet结尾的的URL访问,则无法响应。

说明,web.xml的设置会覆盖Servlet中的注解设置。


虽然这个Demo比较简单,但仍然可以发现,上面的代码可读性是比较差的。视图逻辑写死在Java代码中,和处理逻辑混在一起,修改维护都很麻烦。

所以需要jsp将用out.println()输出的视图逻辑抽取出来,由JSP专门负责视图渲染,Servlet处理业务逻辑,也便于前端、后台开发人员分工协作。

对Servlet的回顾就到这,还有很多细节和知识点无法面面俱到。在遇到问题的时候上网查阅相关资料即可。


1 0