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