天天看点

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器

目录

1. Servlet请求处理

2. Servlet中文乱码问题

3. request/response对象的使用

4. Cookie的应用

5. 过滤器

1. Servlet请求处理

表单提交中get和post方式的区别有几点

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
  4. 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);
}
           

2. Servlet中文乱码问题

乱码情况:

  1. 客户端提交数据到servlet中文出现乱码
  2. 响应至客户端包含中文出现乱码

解决方法:

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页面,写一个表单用于传送表单数据。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
	<form action="./IndexServlet" method="post">
		<input type="text" placeholder="请输入账号...." name="username">
		<input type="text" placeholder="请输入性别" name="gender">
		<input type="password" placeholder="请输入密码...." name="password">
		<input type="submit" value="登录">
	</form>
</body>
</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);
	}
}
           

启动服务器:

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器

点击登录后查看控制台:

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器

出现了中文乱码的情况

修改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);
	}
}
           
JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器

get方法处理方式和这种方法相似,上面也已经说过了。

响应至客户端包含中文时乱码: 

  1. response.setCharacterEncoding("GBK");  
  2. response.setContentType("text/html; charset=GBK");

3. request/response对象的使用

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
           

4. Cookie的应用

Cookie是服务器端或javascript用于维护客户端的一种方式;Cookie是驻留在客户端的一个文本文件;

作用:在客户端保存用户相关的简单信息,访问某些网站时登录界面设置保存用户名复选框,下次访问登录页面自动把之前输入用户名显示在界面,自动保存用户名,如果浏览器清除了缓存,则cookie文件就删除了。

Cookie类相关方法:

  1. set/getName()
  2. set/getValue()
  3. set/getMaxAge()  失效时间   单位秒
  4. set/getPath()  适用的路径
  5. set/getDomain()  适用的域名

5. 过滤器

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:

①以常规的方式调用资源。

②利用修改过的请求信息调用资源。

③调用资源,但在发送响应到客户机前对其进行修改。

④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法: 

init(): 初始化方法,性质等同与servlet的init方法。

doFilter():完成实际的过滤操作,当请求访问过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器

destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。性质等同与servlet的destory()方法。

新建一个filter,来统一处理乱码问题:

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器
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中添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>java_servlet_test</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-name>IndexServlet</servlet-name>
    <servlet-class>com.chtw.servlet.IndexServlet</servlet-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>张山</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>IndexServlet</servlet-name>
    <url-pattern>/servlet01</url-pattern>
  </servlet-mapping>
  
  
  <filter>
  	<filter-name>IndexFilter</filter-name>
  	<filter-class>com.chtw.filter.IndexFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>IndexFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
           

IndexServlet中将处理乱码的代码注释掉,然后启动服务器:

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器
JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器

本人联系方式2329095893,欢迎各位进行学习讨论

欢迎关注熊熊出没ING公众号,不定时跟新Java、python、信息安全等相关知识哦。

JavaEE(五) Servlet高级应用1. Servlet请求处理2. Servlet中文乱码问题3. request/response对象的使用4. Cookie的应用5. 过滤器