目录
1. Servlet请求处理
2. Servlet中文乱码问题
3. request/response对象的使用
4. Cookie的应用
5. 过滤器
表单提交中get和post方式的区别有几点
那么在servlet中,是如何处理这些请求的呢?
表单以POST方式提交, servlet调用doPost()处理,
doPost()方法有两个参数:HttpServletRequest对象封装请求中数据(HTTP头部)及客户端信息,HttpServletResponse 客户端响应
表单以GET方式提交,即GET请求;处理方式方法和doPost完全相同,一个servlet可同时处理POST,GET请求。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理GET方法");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
乱码情况:
解决方法:
Get提交:
软编码转换 new String(suser.getBytes("ISO-8859-1"),"GBK|UTF-8")
批量解决:Tomcat/conf/server.xml设置URIEncoding="GBK|UTF-8"
Post提交
对获取到的数据转编码:new String (suser.getBytes("ISO-8859-1"),"GBK");
获取数据前设置request编码: request.setCharacterEncoding("GBK|UTF-8");
下面举个列子:在WebContent中创建一个html页面,写一个表单用于传送表单数据。
首页
Servlet中修改上一节的代码:
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* index
* @author CHTW
*
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String gender = request.getParameter("gender");
String passsword = request.getParameter("passsword");
System.out.println(username);
System.out.println("gender:"+gender);
System.out.println("password:"+password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
启动服务器:
点击登录后查看控制台:
出现了中文乱码的情况
修改IndexServlet:
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* index
* @author CHTW
*
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String gender = request.getParameter("gender");
String password = request.getParameter("password");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
gender = new String(gender.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username:"+username);
System.out.println("gender:"+gender);
System.out.println("password:"+password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
get方法处理方式和这种方法相似,上面也已经说过了。
响应至客户端包含中文时乱码:
request 根据单词意思也可以猜到,用于接收客户端浏览器提交的数据 。常用方法如下:
getScheme() //获取协议名
getServerName() //获取ip或机器名或域名
getServerPort() //获取端口号
getContextPath() //获取上文路径名[工程名]
getSession() //获取通信会话HttpSession对象
getQueryString() //获取请求字符串
request.getRequestURI()//获得工程名/servlet路径
getRemoteHost() //获取客户端主机
getRemoteAddr() //获取客户端IP
getRequestDispatcher() //获取请求转发对象
getCookies() //获取客户端发送来的Cookie对象数组
getServletPath() //获取Servlet对应的路径
setCharacterEncoding(arg0) //设置request对象的数据字符集
response 对象的功能则是将服务器端的数据发送到客户端浏览器。常用方法如下:
setContentType(arg0) //设置JSP页面的显示方式,如'text/html','text/html; charset=gb2312’'等
setCharacterEncoding(arg0) //设置页面的编码方式:比如gb2312, gbk, big5, 还有UTF-8等
addCookie(Cookie) //往客户端添加一个Cookie
sendRedirect(String) //重定向请求
response.setHeader(name,contect); //设置html头head
Cookie是服务器端或javascript用于维护客户端的一种方式;Cookie是驻留在客户端的一个文本文件;
作用:在客户端保存用户相关的简单信息,访问某些网站时登录界面设置保存用户名复选框,下次访问登录页面自动把之前输入用户名显示在界面,自动保存用户名,如果浏览器清除了缓存,则cookie文件就删除了。
Cookie类相关方法:
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
init(): 初始化方法,性质等同与servlet的init方法。
doFilter():完成实际的过滤操作,当请求访问过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。性质等同与servlet的destory()方法。
新建一个filter,来统一处理乱码问题:
package com.chtw.filter;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/IndexFilter")
public class IndexFilter implements Filter {
public IndexFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//该过滤器主要防止乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("textml;charset=utf-8");
//过滤链过滤下一条
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
web.xml中添加配置:
java_servlet_test
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
IndexServlet
com.chtw.servlet.IndexServlet
name
张山
IndexServlet
/servlet01
IndexFilter
com.chtw.filter.IndexFilter
IndexFilter
/*
IndexServlet中将处理乱码的代码注释掉,然后启动服务器:
本人联系方式2329095893,欢迎各位进行学习讨论
欢迎关注熊熊出没ING公众号,不定时跟新Java、python、信息安全等相关知识哦。