MVC与过滤器

来源:互联网 发布:男士抗痘洗面奶知乎 编辑:程序博客网 时间:2024/05/16 15:16

关键词:jsp,javabean, servlet ,MVC,过滤器,中文乱码
今天我们在一个小实例中来讲解,j2ee中几个重要的概念。
首先要求我的读者有基本的JSP的知识,至少要知道JSP中常用的内置对象的用法。有些网站经验的朋友都应该知道,注册功能应该是应用软件不可缺少的部分,我用一个最简单不过的实例:注册一个姓名,来囊括其中所以的知识点
首先您在ECLIPSE中必须配置好TOMCAT服务器,然后建立一个工程名为servlet的项目工程。在WebRoot下面新建一个index.jsp。关键代码:
<form action="userServlet" method="post">
        <input type="text" name="name" />
        <input type="submit" name="submit" value="提交"/>
</form>
其中包括一个文本框,命名为nameaction表示该页面将会交给userServlet来处理,注意这里的userServelt表示一个指向userServlet的相对路径,该路径应该与在web.xml中配置的相匹配。好,我们先看下web.xml的配置的userServlet:
<servlet>
    <servlet-name>userServlet</servlet-name>
    <servlet-class>com.tsing.servlets.UserServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>userServlet</servlet-name>
    <url-pattern>/userServlet</url-pattern>
</servlet-mapping>
在这里<servlet-class>表示servlet所在包的路径,<servlet-name>表示该servlet生成实例的名称,<servlet-mapping>表示servlet映射到的相对url地址
按照我的编程习惯,在静态表单创建完毕之后应该是先创建servlet,这里的servlet有了特殊的作用,也就是处理数据,这是相当重要的一个概念:



HttpServlet.java
package com.tsing.servlets;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tsing.user.User;
public class UserServlet extends HttpServlet{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
       doPost(request,response);
    }  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        String name = request.getParameter("name");
       User user = new User();
       user.setName(name);
       request.setAttribute("user", user);
       RequestDispatcher requestDispatcher = request.getRequestDispatcher("/show.jsp");
       requestDispatcher.forward(request, response);
    }
}
在处理数据的过程中,servlet首先将客户端传递来的数据接受到,然后把数据捏到一个javabean中,然后在发送将捏好的这个对象在转发置客户端,这样做的好处是使用OO的思想将数据打造成对象,便于理解,传输更快,获取方便等等。
User.java

package com.tsing.user;

public class User {
    private String name;
    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
}

最后配置一下这个servlet,配置的方法在上面已经提到。将工程发布到tomcat服务器中,然后在url地址栏中输入:  
http://localhost:8080/servlet/index.jsp
出现以下的界面



试着提交一下:

页面显示的时候出现了中文的乱码,这是因为tomcat服务器在接受时,无法识别中文,导致转换错误。通常我们可以在servlet一开始的地方加上

request.setCharacterEncoding("GB2312");

这时候可以解决。


但是,这只能处理一个客户端页面的提交,有没有一劳永逸的办法呢?过滤器考虑到了这一点
我们可以自己开发一个过滤器,来统一的处理中文乱码问题
开发一个过滤器需要继承一个Filter接口并且实现其中的方法,然后将要在web.xml中配置,任何请求在到达目标组件之前都会通过过滤器的过滤。
    package com.tsing.tools;
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;
import javax.servlet.http.HttpServletRequest;
public class FilterServlet implements Filter{
    private FilterConfig filterConfig;
    private String targetEncoding="gb2312";
    public void destroy() {
       // TODO Auto-generated method stub
       this.filterConfig = null;
    }
    public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException {
       // TODO Auto-generated method stub
       HttpServletRequest request = (HttpServletRequest)srequest;
       request.setCharacterEncoding(targetEncoding);
       chain.doFilter(srequest, sresponse);
    }
    public void init(FilterConfig config) throws ServletException {
       // TODO Auto-generated method stub
       this.filterConfig = config;
       this.targetEncoding = config.getInitParameter("encoding");
      
    }
    public FilterConfig getFilterConfig() {
       return filterConfig;
    }

    public void setFilterConfig(FilterConfig filterConfig) {
       this.filterConfig = filterConfig;
    }
}
在doFilter中注意要将ServletRequest的对象转换成HttpServletRequest,因为你的通过HTTP来请求服务器响应的。
最后配置下该过滤器
<filter>
    <filter-name>filterServlet</filter-name>
    <filter-class>com.tsing.tools.FilterServlet</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>GB2312</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>filterServlet</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
<filter-class>为过滤器的所在包的路径,<filter-name>为该过滤器实例化后的名称,<init-param>为在init中初始化的参数,<param-name>表示参数名称,<param-value>表示参数值,下面表示该过滤器映射的地址,该地址表示处理在/下的所有servlet。