servlet中文乱码_第七章 Servlet高级编程

本文围绕Servlet展开,介绍了Servlet内的跳转方式,包括重定向和服务器内跳转,说明了其适用场合。还提及ServletContext的高级功能,如获取绝对路径。同时阐述了使用过滤器的情况,如解决中文乱码、控制登录和权限等,并给出了相关代码示例。

1.在 Servlet 内实现跳转

在前面的章节中已经提到,Servlet 是充当控制者(Controller)的角色的,可以用来处理来自 JSP 页面的输入参数,以及从 JavaBean 中读取来自数据库的数据,最后跳转到目标页面。因此,Servlet 为了实现控制者的这一角色,必须要能够实现跳转

2.常用的 Servlet 内跳转有 2 种

(1) 重定向(对应 JSP 内置对象中的 sendRedirect)

response.sendRedirect("URL 地址");

(2)服务器内 跳转(对应 JSP 中的 forward 标签)

ServletContext application = this.getServletContext();

RequestDispatcher rd = application.getRequestDispatcher("URL 地址");

rd.forward(request, response);

这两种在 Servlet 内的跳转与 JSP 中提到的跳转是等效的。只是因为一个是位于 JSP 页面中,一个是位于 Servlet 内。需要注意的是,两种情况下的 URL 地址写法不一样。在第一种中,如果写绝对路径,必须将虚拟目录根目录写在里面,如prj07/page.jsp;第二种方法中,不需要将虚拟目录根目录写在里面,如/page.jsp

  1. 以“初始化servlet”为例。很多网站中,首页上就存在很多从数据库中查询的数据结果,但是查询数据库的代码又不能写在JSP内,因此,可以用servlet查询数据库,得到结果,跳转到JSP显示。
  1. 两种方法的适用场合

重定向redirect:当不需要传递参数或者需要跳转到另一个服务器页面时使用重定向redirect

服务器内跳转forward

当需要从 A 页面跳转到 B 页面时,存在着大量暂态数据(即在 B 页面显示过后就可以不用的数据)时,为了节省内存,可以使用服务器内跳转,可以避免把很多内容存储在 session中,从而导致服务器内存消耗过大的情况

5.ServletContext高级功能

ServletContext 是 application 对象所对应的接口,它具有一些高级功能,其中最常见的是获取绝对路径

ServletContext 能够直接获取当前工程中资源在服务器硬盘上的绝对路径

6.

  1. 使用过滤器

c7097761ad89540fa22e4ce07dbf9d03.png
  1. 需要过滤器的情况
  2. 情况一: 为了解决中文乱码问题
  3. 情况二:很多的门户网站都会有登录页面,这是为了业务需求,同时也是为了使用户控制更加的安全。
  4. 情况三:许多的网站都存在着各种不同的权限,比如,只有管理员才可以对网站的某些数据进行维护和修改,一般的普通用户是无法完成该功能的。

9.过滤器属于一种小巧的、可插入的 Web 组件,它能够对 Web 应用程序的前期处理和后期处理进行控制,可以拦截请求和响应,查看、提取或者以某种方式操作正在客户端和服务器之间进行交换的数据

10.Servlet 过滤器可以当作一个只需要在 web.xml 文件中配置就可以灵活使用、可以重用的模块化组件。它能够对 JSP、HTML、Servlet 文件进行过滤

例(一)在Servlet内实现 跳转==forward服务器内跳转

http://localhost:8088/prj07/servlet/InitServlet

403d80e2f8fd1c835bf02b898c35f3ba.png

InitServlet.java

package com.demo;

import java.io.IOException;

import java.io.PrintWriter;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class InitServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String message="欢迎光临,,";

request.setAttribute("msg", message);

ServletContext application=this.getServletContext();

RequestDispatcher rd=application.getRequestDispatcher("/index.jsp");

rd.forward(request, response);

}

}

index.jsp

<body>

<%= request.getAttribute("msg") %> <br>

</body>

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>prj07</display-name>

<servlet>

<description>This is the description of my J2EE component</description>

<display-name>This is the display name of my J2EE component</display-name>

<servlet-name>InitServlet</servlet-name>

<servlet-class>com.demo.InitServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>InitServlet</servlet-name>

<url-pattern>/servlet/InitServlet</url-pattern>

</servlet-mapping>

<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>

</web-app>

例(二)ServletContext高级功能—==RealPath绝对路径

5a01de71335ae226ae82fb048e0ce361.png

package com.demo;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ShowRealPathServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

ServletContext application=this.getServletContext();

String realPath=application.getRealPath("/");

System.out.println("项目的绝对路径是:"+realPath);

}

}

例(三)使用过滤器

一.没有使用过滤器

post的提交方式 只能用do post()方法来处理
get或者url的提交方式 只能用do get()方法来处理

1.do get()出现乱码

2dbca81c0414b764388955f14e220703.png

DealWithServlet.java-----doGet

package 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 DealWithServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String Sname=request.getParameter("stuname");

System.out.println("学生的姓名:"+Sname);

}

}

2.do post 乱码

497ba4cc28879e6dc141c4333f9605a1.png

package 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 DealWithServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String Sname=request.getParameter("stuname");

System.out.println("学生的姓名:"+Sname);

}

}

二.使用过滤器,解决 乱码问题

DealWithServlet.java

package 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 DealWithServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String Sname=request.getParameter("stuname");

System.out.println("学生的姓名:"+Sname);

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doPost(request,response);

}

}

filterForm.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body>

<form action="servlet/DealWithServlet" method="post">

请输入学生信息的模糊资料:

<input type="text" name="stuname"> <br>

<input type="submit" value="查询">

</form>

</body>

</html>

EncodingFilter.java

package 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;

public class EncodingFilter implements Filter{

public void init(FilterConfig config) throws ServletException {}

public void destroy(){}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

{

request.setCharacterEncoding("gb2312");

chain.doFilter(request,response);

}

}

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>Filter</display-name>

<servlet>

<description>This is the description of my J2EE component</description>

<display-name>Thisisthe display name of myJ2EE component</display-name>

<servlet-name>DealWithServlet </servlet-name>

<servlet-class>servlet.DealWithServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>DealWithServlet</servlet-name>

<url-pattern>/servlet/DealWithServlet</url-pattern>

</servlet-mapping>

<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>

<filter>

<filter-name> EncodingFilter </filter-name>

<filter-class> filter.EncodingFilter</filter-class>

<init-param>

<param-name> paramName </param-name>

<param-value>paramValue </param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>EncodingFilter </filter-name>

<url-pattern> /* </url-pattern>

</filter-mapping>

</web-app>

例(二)测试过滤器 TestFilter

doFilter函数 再调用 Servlet函数

http://localhost:8088/TestFilter/servlet/TestServlet

35dac6504c8ca80850d32c2190134b77.png

filter/ TestFilter.java

package 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;

public class TestFilter implements Filter {

public TestFilter() { System.out.println("过滤器 构造函数"); }

public void init(FilterConfig config) {

System.out.println("过滤器 初始化函数");

}

public void destroy(){

System.out.println("过滤器 消亡函数");

}

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException{

System.out.println(" 过滤器 doFilter函数");

chain.doFilter(request, response);

}

}

/servlet/TestServlet.java

package 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 TestServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("TestServlet被调用 ");

}

}

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>TestFilter</display-name>

<servlet>

<description>This is the description of my J2EE component</description>

<display-name>This is the display name of my J2EE component</display-name>

<servlet-name>TestSrvlet</servlet-name>

<servlet-class>servlet.TestServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>TestSrvlet</servlet-name>

<url-pattern>/servlet/TestServlet</url-pattern>

</servlet-mapping>

<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>

<filter>

<filter-name>TestFilter</filter-name>

<filter-class>filter.TestFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>TestFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值