Servlet工作流程Demo

在学习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 {// 继承HttpServlet
	
	private 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的回顾就到这,还有很多细节和知识点无法面面俱到。在遇到问题的时候上网查阅相关资料即可。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值