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:

我的第一个Servlet页面
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类。

public class MyServlet extends HttpServlet
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请求,并将请求中的参数的值输出到页面中.

MyServlet.java
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();
    }
}
web.xml
<?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>
index.jsp
<%@ 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页面进行显示查看.

User.java
//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;
    }
}
index.jsp
//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>
AddServlet.java
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);  //请求转发
    }

}
web.xml
//如果没有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>
manager.jsp
<%@ 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.

CountFilter.java
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() {

    }
}
web.xml
<?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>
index.jsp
<%@ 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>

  

字符编码过滤器,用过过滤器来处理字符编码,便可以做到既简单又万无一失.

例:实现图书信息的添加功能,并创建字符编码过滤器,避免中文乱码现象的产生.

CharactorFilter.java
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值
    }

}
web.xml
<?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>
AddServlet.java
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();
    }
}
index.jsp
//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>

  

 

转载于:https://www.cnblogs.com/wzmmao/archive/2012/08/14/2638527.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值