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
- 以“初始化servlet”为例。很多网站中,首页上就存在很多从数据库中查询的数据结果,但是查询数据库的代码又不能写在JSP内,因此,可以用servlet查询数据库,得到结果,跳转到JSP显示。
- 两种方法的适用场合
重定向redirect:当不需要传递参数或者需要跳转到另一个服务器页面时使用重定向redirect
服务器内跳转forward
当需要从 A 页面跳转到 B 页面时,存在着大量暂态数据(即在 B 页面显示过后就可以不用的数据)时,为了节省内存,可以使用服务器内跳转,可以避免把很多内容存储在 session中,从而导致服务器内存消耗过大的情况
5.ServletContext高级功能
ServletContext 是 application 对象所对应的接口,它具有一些高级功能,其中最常见的是获取绝对路径
ServletContext 能够直接获取当前工程中资源在服务器硬盘上的绝对路径
6.
- 使用过滤器

- 需要过滤器的情况
- 情况一: 为了解决中文乱码问题
- 情况二:很多的门户网站都会有登录页面,这是为了业务需求,同时也是为了使用户控制更加的安全。
- 情况三:许多的网站都存在着各种不同的权限,比如,只有管理员才可以对网站的某些数据进行维护和修改,一般的普通用户是无法完成该功能的。
9.过滤器属于一种小巧的、可插入的 Web 组件,它能够对 Web 应用程序的前期处理和后期处理进行控制,可以拦截请求和响应,查看、提取或者以某种方式操作正在客户端和服务器之间进行交换的数据
10.Servlet 过滤器可以当作一个只需要在 web.xml 文件中配置就可以灵活使用、可以重用的模块化组件。它能够对 JSP、HTML、Servlet 文件进行过滤
例(一)在Servlet内实现 跳转==forward服务器内跳转
http://localhost:8088/prj07/servlet/InitServlet

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绝对路径

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()出现乱码

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

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

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

1万+

被折叠的 条评论
为什么被折叠?



