关键词: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>
其中包括一个文本框,命名为name。action表示该页面将会交给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。