JEE_Servlet
Servlet:按Servlet规范编写的Java类,通常情况下我们编写的Servlet对象都继承于HttpServlet,主要用于B/S结构的开发。
Servlet是使用Java Servlet接口运行在Web应用服务器上的Java程序。
Servlet与JSP:
Servlet是先于JSP产生的,Sun公司提出的JSP技术是为了将HTML代码,CSS样式代码,Javascript脚本代码等相关代码直接写入JSP页面中,简化程序员对Web程序的开发。
JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。
Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。【缺一个这样的页面!!】
由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在Java代码中,这的确让人不胜其烦。JSP的出现弥补了这种不足,JSP通过在标准的HTML页面中插入Java代码,其静态的部分无须Java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用Java脚本控制。
从表面上看,JSP页面已经不再需要Java类,似乎完全脱离了Java面向对象的特征。事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
推荐:http://www.baidu.com/baidu?word=JSP%E4%B8%8EServlet&se=360se_8_dg&ie=utf-8
------>开发Servlet:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { public TestServlet() { super(); } public void destroy() { super.destroy(); } public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); request.setCharacterEncoding("GB18030"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println("<br>"); String x = request.getParameter("x"); String y = request.getParameter("y"); out.println("x="+x); out.println("<br>"); out.println("y="+y); out.println("<br>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println("<br>"); String x = request.getParameter("x"); String y = request.getParameter("y"); out.println("x="+x); out.println("<br>"); out.println("y="+y); out.println("<br>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Put your code here } public String getServletInfo() { return "This is my default servlet created by Eclipse"; } public void init() throws ServletException { // Put your code here } }
//
Servlet API常用接口与类:
Servlet接口,HttpServlet类,HttpServletRequest类,HttpServletResponse类。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.io.IOException; import javax.servlet.ServletConfig; 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 demo */ @WebServlet("/demo") public class demo extends HttpServlet { private static final long serialVersionUID = 1L; public demo() { super(); // TODO Auto-generated constructor stub } public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub } public void destroy() { // TODO Auto-generated method stub } public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } public String getServletInfo() { // TODO Auto-generated method stub return null; } protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
//
Servlet接口实现类:
1)Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet 。 2)HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法, 它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。 3)HttpServlet在实现Servlet接口时,覆写了service方法, 该方法体内的代码会自动判断用户的请求方式, 如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。 因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。 4)在Servlet的整个生命周期内,Servlet的init方法只被调用一次。 而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。 对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
推荐: http://www.baidu.com/baidu?word=Servlet%E6%8E%A5%E5%8F%A3&se=360se_9_dg&ie=utf-8
//
细节:
1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。 2)<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 3)一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。 1)如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。 2)凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。 3)在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。 4)当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。
//
Servlet的生命周期:
Servlet的运行需要配置web.xml配置文件。
Servlet学习过程中要注意看看Servlet的生命周期:
1、客户端发送一个请求(也就是一个servlet的访问URL)
2、服务器端解析请求(通过web.xml里面的servlet配置解析)
3、servlet容器创建servlet的一个实例
4、容器调用该实例的init()方法
5、如果容器对该servlet有请求,则调用此实例的service()方法
6、返回响应消息给servlet容器
7、返回响应消息给客户端
8、容器在销毁本实例前调用它的destroy()方法
9、销毁并标记该实例以供作为垃圾收集
//
HttpServlet:
Servlet学习中碰到HttpServlet是抽象类,
它没有抽象方法,但它实现了service()方法,
service()方法中又调用了doGet()和doPost()方法。
doGet()和doPost()方法在HttpServlet类中都有默认的实现。
而我们写的servlet程序一般都继承HttpServlet,重写doGet和doPost方法。
Service()方法被调用时会自动调用我们重写的doGet或doPost方法,
因此我们的Servlet程序主要任务就是重写这两个方法。
//
doGet()和doPost()的调用:
从浏览器键入URL时,浏览器会通过HTTP的GET请求连接服务器,到servlet时就会调用doGet方法,
这个不是说默认调用doGet方法,而是浏览器的连接请求是GET请求。
当通过某个页面的表单请求时,就要看表单的请求类型是POST还是GET了
(其实还有其他的HTTP请求类型,不过现在基本都弃之不用了)。
1.
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
处理GET请求,显式提交客户端的信息,信息有长度限制;
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
允许客户端提交没有长度限制的数据信息;
2.
doGet()是在地址行显示要传送的信息.
doPost()则不显示任何信息.具体应用时,有密码时用doPost().
3.
doGet() 超链接时起作用,doPost() form提交时起作用
<form method=post action=xx>--就是调完doGet(),再调doPost();
<form action=xx>--就是调完doGet(),不调doPost();
//
Servlet过滤器(Filter):
过滤器是用于过滤Servlet的请求和响应,过滤器是存在于请求和被请求资源之间的。
过滤器就像当于一个中间件,请求要经过过滤器,
然后过滤器才去掉用Servlet,Servlet的响应也会被过滤器截获并作相应的处理。
Filter是一个接口,要写一个自己的Filter就只能实现Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比较相似,
也是会先调用init()方法,
然后再调用核心的处理过滤的方法doFilter(),这个方法中可定义了过滤规则,
然后是destory()方法销毁Filter对象。
======================================================================
//Servlet 什么是Servlet: Servlet是一种服务器端的Java应用程序,可以生成动态的Web页面,担当客户请求与服务器响应的中间层。
Servlet的基本结构: 1)一个Servlet要继承HttpServlet, 2)根据数据决定通过get还是post发送,重写doGet,doPost或Service方法。所带参数有HttpServletRequest类型和HttpServletResponse类型。 3)Servlet还要在web.xml文件中部署描述文件,将URL映射到Servlet中: <Servlet> <Servlet-name>UserServlet</Servlet-name> <Servlet-class>mao.UserServlet</Servlet-class> </Servlet> <Servlet-mapping> <Servlet-name>UserServlet</Servlet-name> <url-pattern>*.user</url-pattern> </Servlet-mapping>
Servlet的生命周期: Servlet运行在Servlet容器中,其生命周期由容器来管理。 Servlet的生命周期通过javax.Servlet.Servlet接口中的init(),service(),destroy()方法来表示.
Servlet的初始化参数: 容器初始化一个Servlet时,会为每个Servlet创建唯一一个ServletConfig, 容器从web.xml中读出Servlet的初始化参数,并把这些参数交给ServletConfig, 然后把ServletConfig传递给Servlet的Init()方法。整个过程Servlet初始化参数只读一次。 ServletConfig的主要任务是提供初始化参数。 Servlet的初始化参数只能为该Servlet所用,JSP不能读出web.xml中特定<Servlet>标记中的初始化参数。 Servlet可以在web.xml中配置初始化参数: <Servlet> <init-param> <param-name>filePath</param-name> <param-value>e:\mao\</param-value> </init-param> <Servlet-name>UserServlet</Servlet-name> <Servlet-class>mao.UserServlet</Servlet-class> </Servlet> 在Servlet代码中,获取初始化参数:out.println(this.getServletConfig().getInitParameter("filePath"));
ServletContext初始化参数: ServletContext初始化参数(上下文初始化参数)对整个Web应用都可用,包括Servlet和JSP。 Servlet中:out.println(this.getServletContext().getInitParameter("filePath")); JSP中:<%= pageContext.getServletContext().getInitParameter("filePath")%>
Servlet请求分派: 在Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,HTML页面,啦处理对请求的响应。
有三种方法可以得到RequestDispatcher对象: 1)ServletRequest的getRequestDispatcher(String path)方法 2)ServletContext的getNamedDispatcher(String path)方法 3)ServletContext的getRequestDispatcher(String path)方法
RequestDispatcher对象由Servlet容器创建,提供两种方法用于请求转发: forward(ServletRequest,ServletResponse):请求转发给服务器上另一个Servlet,JSP或HTML页面,原先Servlet没有提交的内容被清除。 include(ServletRequest,ServletResponse);请求转发后,原先的Servlet还可以继续输出响应信息。
重定向:工作在浏览器端,sendRedirect()可以带参数传递,重定向后浏览器地址栏会出现重定向页面的URL。 请求分派:forward/include。
会话管理机制: Servlet API规范定义了一个简单的HttpServlet接口,通过它可以方便地实现会话跟踪用户。 会话对象中存取数据: session.setAttribute(key,value); session.getAttribute(key);
Servlet过滤器: Servlet过滤器相关的API有三个接口,它们都在javax.Servlet包中,分别是Filter,FilterChain,FilterConfig接口。 1)所有的过滤器都必须实现Filter接口,该接口定义了init(),doFilter(),destory()三个方法. 2)FilterChain接口用于对资源请求过滤链的依次调用,定义了doFilter()方法。 3)FilterConfig接口检索过滤名,初始化参数及活动的Servlet上下文。该接口提供了四个方法。 getFilterName(),getServletContext(),getInitParameter(),getInitParameterNames()。
过滤器的配置: 过滤器通过Web应用程序中的部署描述文件web.xml中的XML标签来声明: <filter>:过滤器定义元素 <filter-name>:过滤器名字 <filter-class>:由容器载入的实际类完整路径 <init-param>:为过滤器实例提供初始化参数 <param-name> <param-value> </filter> <filter-mapping>:过滤器规则配置 <filter-name> <url-pattern>:将过滤器映射到指定特征的URL的JSP页面 </filter-mapping>
过滤器链配置:
Servlet监听器: 监听器Listener接口: Event类:
Servlet上下文: 服务器上的每个Web应用都有一个背景环境对象,称为上下文。 Web应用中的所有资源共享此上下文对象,因此上下文对象提供了一个同Web应用内不同资源共享信息的场所。 通过ServletConfig实例的getServletContext()方法可以得到Servlet运行的上下文对象。 Servlet上下文功能: 1)ServletContext通过getResource()和getResourceAsStream()方法访问Web应用程序内的静态资源文件。 2)Servlet通过上下文对象来存储Java对象,如getAttribute()等方法。 3)获取初始化信息,如ServletContext.getInitParameterNames()。 4)提供日志支持,如ServletContext.log(String msg)。
Servlet处理流程:
例:创建Servlet对象,通过doGet()方法处理GET请求,并将请求中的参数的值输出到页面中.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.lyq.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet对象 */ public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 处理GET请求 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取name参数值 String name = request.getParameter("name"); // 从response中获取PrintWriter对象 PrintWriter writer = response.getWriter(); // 判断name是否为空 if(name != null){ // 如果name不为空,将通过writer输出name writer.write("Hello " + name + " !"); } // 刷新writer writer.flush(); // 关闭writer writer.close(); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>10.1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- Servlet声明 --> <servlet> <!-- Servlet名称 --> <servlet-name>MyServlet</servlet-name> <!-- Servlet类名 --> <servlet-class>com.lyq.servlet.MyServlet</servlet-class> </servlet> <!-- Servlet映射 --> <servlet-mapping> <!-- Servlet名称 --> <servlet-name>MyServlet</servlet-name> <!-- Servlet映射URL地址 --> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> </web-app>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <div align="center"> <a href="MyServlet?name=Tom">Servlet测试</a> </div> </body> </html>
Servlet处理表单数据:
例:通过Servlet处理表单数据,实现用户信息的添加功能,并将信息放置到ServletContext中,通过JSP页面进行显示查看.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//JavaBean: User package com.lyq.bean; /** * 用户信息对象 * @author Li YongQiang * */ public class User { // 用户姓名 private String name; // 性别 private String sex; // 家庭住址 private String add; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAdd() { return add; } public void setAdd(String add) { this.add = add; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//Servlet:AddServlet, onsubmit:Javascript <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>添加人员信息</title> <script type="text/javascript"> function check(form){ with(form){ //with引用对象 if(name.value == ""){ alert("姓名不能为空!"); return false; } if(add.value == ""){ alert("家庭住址不能为空!"); return false; } } } </script> </head> <body> <form action="AddServlet" method="post" onsubmit="return check(this);"> <table align="center" width="400"> <tr> <td align="center" colspan="2"> <h2>添加人员信息</h2> <hr> </td> </tr> <tr> <td align="right">姓 名:</td> <td> <input type="text" name="name"> </td> </tr> <tr> <td align="right">性 别:</td> <td> <input type="radio" name="sex" value="男" checked="checked">男 <input type="radio" name="sex" value="女">女 </td> </tr> <tr> <td align="right">家庭住址:</td> <td> <textarea rows="5" cols="30" name="add"></textarea> </td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="添 加"> </td> </tr> </table> </form> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.lyq.servlet; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lyq.bean.User; /** * Servlet implementation class AddServlet */ public class AddServlet extends HttpServlet { private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置request的编码格式 request.setCharacterEncoding("GB18030"); // 获取用户姓名 String name = request.getParameter("name"); // 获取性别 String sex = request.getParameter("sex"); // 获取家庭住址 String add = request.getParameter("add"); // 实例化User User user = new User(); //JavaBean对象:User // 对姓名赋值 user.setName(name); // 对性别赋值 user.setSex(sex); // 对家庭住址赋值 user.setAdd(add); // 获取ServletContext对象 ServletContext application = getServletContext(); //保存信息:ServletContext application 或者 数据库 // 从ServletContext中获取users // 判断List是否为null List<User> list = (List<User>) application.getAttribute("users"); //通过"users"获取list对象 if(list == null){ //获取不到list集合对象,第一次创建 // 实例化list list = new ArrayList<User>(); } // 将user添加到List集合中 list.add(user); // 将List放置于Application范围中 application.setAttribute("users", list); //key-value:users-list // 创建RequestDispatcher对象 // 请求转发到manager.jsp页面 RequestDispatcher dispatcher = request.getRequestDispatcher("manager.jsp"); dispatcher.forward(request, response); //请求转发 } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//如果没有web.xml则页面不会跳转到Servlet <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>10.2</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- Servlet声明 --> <servlet> <!-- Servlet名称 --> <servlet-name>AddServlet</servlet-name> <!-- Servlet类名 --> <servlet-class>com.lyq.servlet.AddServlet</servlet-class> </servlet> <!-- Servlet映射 --> <servlet-mapping> <!-- Servlet名称 --> <servlet-name>AddServlet</servlet-name> <!-- Servlet映射URL地址 --> <url-pattern>/AddServlet</url-pattern> </servlet-mapping> </web-app>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="java.util.List"%> <%@page import="com.lyq.bean.User"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>用户信息管理</title> </head> <body> <table align="center" border="1" width="400"> <tr> <td align="center" colspan="3"> <h2>用户信息管理</h2> </td> </tr> <tr align="center" style="font-weight: bold;"> <td>姓名</td> <td>性别</td> <td>家庭住址</td> </tr> <% List<User> list = (List<User>)application.getAttribute("users"); if(list != null){ for(User user : list){ %> <tr align="center"> <td><%=user.getName()%></td> <td><%=user.getSex()%></td> <td><%=user.getAdd()%></td> </tr> <% } } %> <tr> <td align="center" colspan="3"> <a href="index.jsp">继续添加</a> </td> </tr> </table> </body> </html>
Servlet过滤器:
Servlet过滤器主要用于对客户端浏览器的请求进行过滤处理,再将过滤后的请求转交给下一个资源,它在Java Web开发中具有重要作用.
过滤器放置在javax.servlet包中,其名称为Filter,是FIlter接口,与过滤器有关的还有FilterConfig接口对象,与FilterChain接口对象.
FIlter接口:……。
FilterConfig接口:……。
FilterChain接口:public void doFilter()方法,用于将过滤后的请求传递给下一个过滤器,如果是最后一个则传送给目标资源.
例:创建一个过滤器,实现网站访问计数器的功能,并在web.xml文件的配置中,将网站访问量的初始值设置为5000.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.lyq; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; /** * 统计过滤器 * @author Li YongQiang */ public class CountFilter implements Filter { // 来访数量 private int count; @Override public void init(FilterConfig filterConfig) throws ServletException { // 获取初始化参数 String param = filterConfig.getInitParameter("count"); count = Integer.valueOf(param); // 将字符串转换为int!! } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 访问数量自增 count ++; // 将ServletRequest转换成HttpServletRequest HttpServletRequest req = (HttpServletRequest) request; // 获取ServletContext ServletContext context = req.getSession().getServletContext(); //ServletRequest——HttpServletRequest——ServletContext上下文保存数据 // 将来访数量值放入到ServletContext中 context.setAttribute("count", count); //key-value // 向下传递过滤器 chain.doFilter(request, response); //向下传递 } @Override public void destroy() { } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>10.3</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 过滤器声明 --> <filter> <!-- 过滤器的名称 --> <filter-name>CountFilter</filter-name> <!-- 过滤器的完整类名 --> <filter-class>com.lyq.CountFilter</filter-class> <!-- 设置初始化参数 --> <init-param> //可以设置参数 <!-- 参数名 --> <param-name>count</param-name> <!-- 参数值 --> <param-value>5000</param-value> </init-param> </filter> <!-- 过滤器映射 --> <filter-mapping> <!-- 过滤器名称 --> <filter-name>CountFilter</filter-name> <!-- 过滤器URL映射 --> <url-pattern>/index.jsp</url-pattern> </filter-mapping> </web-app>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>人数统计</title> </head> <body> <h2> 欢迎光临,<br> 您是本站的第【 <%=application.getAttribute("count") %> 】位访客! </h2> </body> </html>
字符编码过滤器,用过过滤器来处理字符编码,便可以做到既简单又万无一失.
例:实现图书信息的添加功能,并创建字符编码过滤器,避免中文乱码现象的产生.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.lyq; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; // 字符编码过滤器 public class CharactorFilter implements Filter { // 字符编码 String encoding = null; @Override public void destroy() { encoding = null; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 判断字符编码是否为空 if(encoding != null){ // 设置request的编码格式 request.setCharacterEncoding(encoding); // 设置response字符编码 response.setContentType("text/html; charset="+encoding); } // 传递给下一过滤器 chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { // 获取初始化参数 encoding = filterConfig.getInitParameter("encoding"); //encoding值 } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>10.3</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>CharactorFilter</filter-name> <filter-class>com.lyq.CharactorFilter</filter-class> <init-param> <param-name>encoding</param-name> //设置encoding的编码方式 <param-value>GB18030</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharactorFilter</filter-name> <url-pattern>/*</url-pattern> //匹配所有请求 </filter-mapping> <servlet> <servlet-name>AddServlet</servlet-name> <servlet-class>com.lyq.AddServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddServlet</servlet-name> <url-pattern>/AddServlet</url-pattern> </servlet-mapping> </web-app>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.lyq; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 添加图书信息的Servlet */ public class AddServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 处理GET请求 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } // 处理POST请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取 PrintWriter PrintWriter out = response.getWriter(); //输出流 // 获取图书编号 String id = request.getParameter("id"); // 获取名称 String name = request.getParameter("name"); // 获取作者 String author = request.getParameter("author"); // 获取价格 String price = request.getParameter("price"); // 输出图书信息 out.print("<h2>图书信息添加成功</h2><hr>"); out.print("图书编号:" + id + "<br>"); out.print("图书名称:" + name + "<br>"); out.print("作者:" + author + "<br>"); out.print("价格:" + price + "<br>"); // 刷新流 out.flush(); // 关闭流 out.close(); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//Servlet:AddServlet <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>添加图书信息</title> </head> <body> <form action="AddServlet" method="post"> <table align="center" border="1" width="350"> <tr> <td class="2" align="center" colspan="2"> <h2>添加图书信息</h2> </td> </tr> <tr> <td align="right">图书编号:</td> <td> <input type="text" name="id"> </td> </tr> <tr> <td align="right">图书名称:</td> <td> <input type="text" name="name"> </td> </tr> <tr> <td align="right">作 者:</td> <td> <input type="text" name="author"> </td> </tr> <tr> <td align="right">价 格:</td> <td> <input type="text" name="price"> </td> </tr> <tr> <td class="2" align="center" colspan="2"> <input type="submit" value="添 加"> </td> </tr> </table> </form> </body> </html>