【JSP开发】自己写的过滤器Filter例子

简介:

目的是让浏览网站的用户所接收到的信息的编码方式统一为UTF-8,防止乱码的产生


1.没加过滤器之前:

拿Jsp工程(名叫web)中的两个Servlet做实验

ChineseServlet.java:

package cn.edu.hpu.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;


public class ChineseServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String data="我的中国心";
		
		request.setAttribute("data", data);
		request.getRequestDispatcher("/result").forward(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}


}


ResultServlet.java
package cn.edu.hpu.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;


public class ResultServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String text=(String)request.getAttribute("data");
		PrintWriter out=response.getWriter();
		
		out.write("传过去的那句话是(The word get is):"+text);
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


	}


}

在web.xml中配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>ChineseServlet</servlet-name>
    <servlet-class>cn.edu.hpu.servlet.ChineseServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ResultServlet</servlet-name>
    <servlet-class>cn.edu.hpu.servlet.ResultServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>ChineseServlet</servlet-name>
    <url-pattern>/chin</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResultServlet</servlet-name>
    <url-pattern>/result</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


启动服务器,在地址栏上输入:http://localhost:8080/web/chin,得到:
?????????The word get is?:?????
出现乱码,说明没有指定编码。


解决办法:
两边servlet同时设置(这里以UTF-8为编码标准):
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");


需要显示的时候:
String text=(String)request.getAttribute("data")+"是传过来的那句话";


System.out.println(text);
OutputStream out =response.getOutputStream(); 
out.write("<html>".getBytes());


//用html技术中meta标签模拟了一个http响应头,来控制浏览器的行为
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
out.write(text.getBytes("UTF-8"));
out.write("</html>".getBytes());
或者直接:
response.setContentType("text/html;charset=UTF-8");


以上方法很臃肿,而且非常不简介,无法应对多个界面,所以要使用过滤器来统一设置编码。


2.加过滤器之后:


ChineseServlet.java:

package cn.edu.hpu.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;


public class ChineseServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String data="我的中国心";
		
		request.setAttribute("data", data);
		request.getRequestDispatcher("/result").forward(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


	}


}


ResultServlet .java:
package cn.edu.hpu.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;


public class ResultServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String text=(String)request.getAttribute("data");
		PrintWriter out=response.getWriter();
		
		out.write("传过去的那句话是(The word get is):"+text);
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


	}


}


过滤器:
package cn.edu.hpu.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class TestFilter implements Filter {
	private String characterEncoding=null;
	
	public void destroy() {
		// TODO Auto-generated method stub
		
	}


	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterchain) throws IOException, ServletException {
		request.setCharacterEncoding(characterEncoding);
		response.setCharacterEncoding(characterEncoding);
		response.setContentType("text/html;charset="+characterEncoding);
		
		//获取URL的路径和参数
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String path=req.getServletPath();
		String param=req.getQueryString();
		if(path!=null&¶m!=null){
			path=path+"?"+param;//全请求路径
		}
		System.out.println("Path:"+path);
		//跳转或带参数跳转
		request.getRequestDispatcher(path).forward(request, response);
	}


	public void init(FilterConfig filterConfig) throws ServletException {
		characterEncoding = filterConfig.getInitParameter("characterEncoding");
		
	}


}


在web.xml中配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <filter>
	<filter-name>TestFilter</filter-name>
	<filter-class>cn.edu.hpu.filter.TestFilter</filter-class>
	<init-param>
		<param-name>characterEncoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
    </filter>
    
    <filter-mapping>
		<filter-name>TestFilter</filter-name>
		<url-pattern>/*</url-pattern>
    </filter-mapping>


  <servlet>
    <servlet-name>ChineseServlet</servlet-name>
    <servlet-class>cn.edu.hpu.servlet.ChineseServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ResultServlet</servlet-name>
    <servlet-class>cn.edu.hpu.servlet.ResultServlet</servlet-class>
  </servlet>




  <servlet-mapping>
    <servlet-name>ChineseServlet</servlet-name>
    <url-pattern>/chin</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ResultServlet</servlet-name>
    <url-pattern>/result</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

启动服务器,在地址栏上输入:http://localhost:8080/web/chin,得到:
传过去的那句话是(The word get is):我的中国心
没有发生乱码,说明过滤成功!!


转载请注明出处:http://blog.csdn.net/acmman/article/details/44100531

相关文章
|
3天前
|
前端开发 Oracle 关系型数据库
关于使用SSM+JSP开发时setter、getter隐式调用问题的小结
本文主要分享了在使用SSM+JSP进行网站开发时,因忽视setter、getter的隐式调用问题而导致的常见bug及其解决方法。详细介绍了setter和getter的隐式调用时机,并给出了具体示例,帮助开发者避免类似问题。
28 11
|
5月前
|
Java 容器
JSP 教程 之 JSP 过滤器 9
JSP和Servlet中的过滤器是Java类,能拦截请求和响应,进行信息处理。过滤器可附加到Servlet、JSP或HTML,通过`web.xml`配置。配置包括定义过滤器名称、类名、初始化参数和拦截资源。`&lt;filter&gt;`、`&lt;filter-name&gt;`、`&lt;filter-class&gt;`用于定义过滤器,`&lt;init-param&gt;`设置参数。
41 7
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
28 0
|
5月前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
100 12
|
5月前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
71 8
|
5月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
61 7
|
5月前
|
缓存 安全 小程序
从基础到进阶:掌握Java中的Servlet和JSP开发
【6月更文挑战第23天】Java Web开发中的Servlet和JSP是关键技术,用于构建动态网站。Servlet是服务器端小程序,处理HTTP请求,生命周期包括初始化、服务和销毁。基础Servlet示例展示了如何响应GET请求并返回HTML。随着复杂性增加,JSP以嵌入式Java代码简化页面创建,最佳实践提倡将业务逻辑(Servlet)与视图(JSP)分离,遵循MVC模式。安全性和性能优化,如输入验证、HTTPS、会话管理和缓存,是成功应用的关键。本文提供了一个全面的学习指南,适合各级开发者提升技能。
44 7
|
5月前
|
存储 缓存 安全
Servlet与JSP在Java服务器端开发中的实践与优化
【6月更文挑战第23天】本文探讨了Java中Servlet与JSP在在线书店系统开发中的应用,强调了它们在动态网站构建和Web效率中的作用。通过实例,展示了Servlet如何作为控制器处理用户登录,JSP则利用EL表达式呈现数据。此外,文章提及了性能优化如分页和缓存,以及安全措施如防止SQL注入和XSS攻击,强调了全面掌握和应用这些技术的重要性,以创建高效、安全的Web应用。
53 7
|
5月前
|
XML Java 数据格式
JSP 教程 之 JSP 过滤器 6
JSP教程介绍了JSP过滤器的概念,它是Java类,能拦截请求和响应,用于处理或修改其中的信息。过滤器可连接到单个或多个Servlet、JSP及HTML页面。示例展示了一个简单的日志过滤器`LogFilter`,它打印网站名称并传递请求。`DisplayHeader`Servlet显示HTTP头信息。在`web.xml`中配置过滤器映射,如`LogFilter`映射到`/*`,影响所有Servlet。访问特定URL会触发过滤器和Servlet的执行,日志可通过Log4J记录到文件。
25 3
|
5月前
|
Java 容器
JSP 教程 之 JSP 过滤器 8
JSP教程讲解了过滤器的使用,过滤器是Java类,能动态拦截请求和响应,用于处理或修改请求/响应信息。过滤器可关联到Servlet、JSP或HTML。过滤器应用顺序由web.xml中`filter-mapping`元素排列决定,顺序反转则只需调整元素顺序。例如,通过调整`filter-mapping`,可以改变LogFilter和AuthenFilter的执行顺序。
24 2