jsp学习与提高(二)——JSP 隐式对象、表单处理及过滤器
1.JSP 隐式对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
JSP所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
2.JSP 表单处理
2.1get请求 http://localhost:8080/testjsp/main.jsp?name=菜鸟教程&url=http://ww.runoob.com
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="java.io.*,java.util.*" %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>菜鸟教程(runoob.com)</title>
- </head>
- <body>
- <h1>使用 GET 方法读取数据</h1>
- <ul>
- <li><p><b>站点名:</b>
- <%= request.getParameter("name")%>
- </p></li>
- <li><p><b>网址:</b>
- <%= request.getParameter("url")%>
- </p></li>
- </ul>
- </body>
- </html>
2.2 post请求
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="java.io.*,java.util.*" %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>菜鸟教程(runoob.com)</title>
- </head>
- <body>
- <h1>使用 POST 方法读取数据</h1>
- <ul>
- <li><p><b>站点名:</b>
- <%
- // 解决中文乱码的问题
- String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");
- %>
- <%=name%>
- </p></li>
- <li><p><b>网址:</b>
- <%= request.getParameter("url")%>
- </p></li>
- </ul>
- </body>
- </html>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>菜鸟教程(runoob.com)</title>
- </head>
- <body>
- <form action="main.jsp" method="POST">
- 站点名: <input type="text" name="name">
- <br />
- 网址: <input type="text" name="url" />
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
- 2.3传递 Checkbox 数据到JSP程序
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>菜鸟教程(runoob.com)</title>
- </head>
- <body>
- <form action="main.jsp" method="POST" target="_blank">
- <input type="checkbox" name="google" checked="checked" /> Google
- <input type="checkbox" name="runoob" /> 菜鸟教程
- <input type="checkbox" name="taobao" checked="checked" />
- 淘宝
- <input type="submit" value="选择网站" />
- </form>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="java.io.*,java.util.*" %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>菜鸟教程(runoob.com)</title>
- </head>
- <body>
- <h1>从复选框中读取数据</h1>
- <ul>
- <li><p><b>Google 是否选中:</b>
- <%= request.getParameter("google")%>
- </p></li>
- <li><p><b>菜鸟教程是否选中:</b>
- <%= request.getParameter("runoob")%>
- </p></li>
- <li><p><b>淘宝是否选中:</b>
- <%= request.getParameter("taobao")%>
- </p></li>
- </ul>
- </body>
- </htm
- 3.jsp过滤器
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
Filter 的执行顺序与在 web.xml 配置文件中的配置顺序一致,一般把 Filter 配置在所有的 Servlet 之前
Servlet 过滤器方法
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
3.2JSP 过滤器实例
- 以下是 Servlet 过滤器的实例,将输出网站名称和地址。本实例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序
- //导入必需的 java 库
- import javax.servlet.*;
- import java.util.*;
- //实现 Filter 类
- public class LogFilter implements Filter {
- public void init(FilterConfig config) throws ServletException {
- // 获取初始化参数
- String site = config.getInitParameter("Site");
- // 输出初始化参数
- System.out.println("网站名称: " + site);
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
- // 输出站点名称
- System.out.println("站点网址:http://www.runoob.com");
- // 把请求传回过滤链
- chain.doFilter(request,response);
- }
- public void destroy( ){
- /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
- }
- }
- DisplayHeader.java 文件代码如下:
- //导入必需的 java 库
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Enumeration;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/DisplayHeader")
- //扩展 HttpServlet 类
- public class DisplayHeader extends HttpServlet {
- // 处理 GET 方法请求的方法
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- // 设置响应内容类型
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- String title = "HTTP Header 请求实例 - 菜鸟教程实例";
- String docType =
- "<!DOCTYPE html> \n";
- out.println(docType +
- "<html>\n" +
- "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
- "<body bgcolor=\"#f0f0f0\">\n" +
- "<h1 align=\"center\">" + title + "</h1>\n" +
- "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
- "<tr bgcolor=\"#949494\">\n" +
- "<th>Header 名称</th><th>Header 值</th>\n"+
- "</tr>\n");
- Enumeration headerNames = request.getHeaderNames();
- while(headerNames.hasMoreElements()) {
- String paramName = (String)headerNames.nextElement();
- out.print("<tr><td>" + paramName + "</td>\n");
- String paramValue = request.getHeader(paramName);
- out.println("<td> " + paramValue + "</td></tr>\n");
- }
- out.println("</table>\n</body></html>");
- }
- // 处理 POST 方法请求的方法
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }
Web.xml 中的 Servlet 过滤器映射(Servlet Filter Mapping)
定义过滤器,然后映射到一个 URL 或 Servlet,这与定义 Servlet,然后映射到一个 URL 模式方式大致相同。在部署描述符文件 web.xml 中为 filter 标签创建下面的条目:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app>
- <filter>
- <filter-name>LogFilter</filter-name>
- <filter-class>com.runoob.test.LogFilter</filter-class>
- <init-param>
- <param-name>Site</param-name>
- <param-value>菜鸟教程</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>LogFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <servlet>
- <!-- 类名 -->
- <servlet-name>DisplayHeader</servlet-name>
- <!-- 所在的包 -->
- <servlet-class>com.runoob.test.DisplayHeader</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>DisplayHeader</servlet-name>
- <!-- 访问的网址 -->
- <url-pattern>/TomcatTest/DisplayHeader</url-pattern>
- </servlet-mapping>
- </web-app>
- 3.2多个过滤器
使用多个过滤器
Web 应用程序可以根据特定的目的定义若干个不同的过滤器。假设您定义了两个过滤器 AuthenFilter 和 LogFilter。您需要创建一个如下所述的不同的映射,其余的处理与上述所讲解的大致相同:
- <filter>
- <filter-name>LogFilter</filter-name>
- <filter-class>com.runoob.test.LogFilter</filter-class>
- <init-param>
- <param-name>test-param</param-name>
- <param-value>Initialization Paramter</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>AuthenFilter</filter-name>
- <filter-class>com.runoob.test.AuthenFilter</filter-class>
- <init-param>
- <param-name>test-param</param-name>
- <param-value>Initialization Paramter</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>LogFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>AuthenFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
3.3过滤器的应用顺序
web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。
例如,上面的实例将先应用 LogFilter,然后再应用 AuthenFilter,但是下面的实例将颠倒这个顺序:
- <filter-mapping>
- <filter-name>AuthenFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>LogFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- 3.4web.xml配置各节点说明
<filter>
指定一个过滤器。<filter-name>
用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>
元素用于指定过滤器的完整的限定类名。<init-param>
元素用于为过滤器指定初始化参数,它的子元素<param-name>
指定参数的名字,<param-value>
指定参数的值。- 在过滤器中,可以使用
FilterConfig
接口对象来访问初始化参数。
<filter-mapping>
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径<filter-name>
子元素用于设置filter的注册名称。该值必须是在<filter>
元素中声明过的过滤器的名字<url-pattern>
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>
指定过滤器所拦截的Servlet名称。<dispatcher>
指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST
,INCLUDE
,FORWARD
和ERROR
之一,默认REQUEST
。用户可以设置多个<dispatcher>
子元素用来指定 Filter 对资源的多种调用方式进行拦截。<dispatcher>
子元素可以设置的值及其意义REQUEST
:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE
:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD
:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR
:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用
3.5Filter 的基本工作原理
- 1、Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的。
- 2、当在 web.xml 注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请求和响应消息是否进行修改。
- 3、当 Servlet 容器开始调用某个 Servlet 程序时,如果发现已经注册了一个 Filter 程序来对该 Servlet 进行拦截,那么容器不再直接调用 Servlet 的 service 方法,而是调用 Filter 的 doFilter 方法,再由 doFilter 方法决定是否去激活 service 方法。
- 4、但在 Filter.doFilter 方法中不能直接调用 Servlet 的 service 方法,而是调用 FilterChain.doFilter 方法来激活目标 Servlet 的 service 方法,FilterChain 对象时通过 Filter.doFilter 方法的参数传递进来的。
- 5、只要在 Filter.doFilter 方法中调用 FilterChain.doFilter 方法的语句前后增加某些程序代码,这样就可以在 Servlet 进行响应前后实现某些特殊功能。
- 6、如果在 Filter.doFilter 方法中没有调用 FilterChain.doFilter 方法,则目标 Servlet 的 service 方法不会被执行,这样通过 Filter 就可以阻止某些非法的访问请求。
4.获得项目根路径、
String a = request.getContextPath();
String b = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
String c = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ a;
jsp学习与提高(二)——JSP 隐式对象、表单处理及过滤器的更多相关文章
- Jsp学习笔记(2)——页面导航、表单、EL表达式
页面导航 有两种跳转页面的方法.重定向和请求转发 两者区别: 请求转发(forward) 重定向(rerect) 请求服务次数 1 2 是否保留第一次请求request范围的属性 保留 不保留 地址栏 ...
- JavaScript学习总结(二、隐式类型转换、eval())
一.(避免)隐式类型转换 console.log(false == 0); //logs true; console.log(false === 0); //logs false; conso ...
- 框架学习之Struts2(二)---基本配置和封装表单数据
一.结果页面配置 1.局部结果页面配置 <!-- 局部结果页面配置--> <package name = "demo" extends = "strut ...
- JSP页面以及JSP九大隐式对象
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...
- JSP与EL隐式对象
一,JSP隐式对象 隐式对象是可以直接使用的,无需声明.因为在JSP转译为servlet文件后,会自动声明其对象. 隐式对象① 说明 out 对应JspWriter对象,其内部关联一个PrintWri ...
- JSP-Runoob:JSP 隐式对象
ylbtech-JSP-Runoob:JSP 隐式对象 1.返回顶部 1. JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明.JSP隐式对 ...
- JSP——JavaServer Page中的隐式对象(implicit object)、指令(directive)、脚本元素(scripting element)、动作(action)、EL表达式
目录 1.JSP概述 2.注释(comment) 2.1.JSP注释 2.2.HTML注释 3.隐式对象(implicit object) 3.1.隐式对象清单 3.2.request对象 3.3.o ...
- JSP——隐式对象(implicit object)
Servlet容器将几个对象传递给它所运行的Servlet. 例如,在Servlet的service方法中获得HttpServletRequest和HttpServletResponse,并在init ...
- JSP学习(一)JSP基础语法
JSP基础语法 1.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. <%@ page language=&quo ...
随机推荐
- Python中出现“TabError: inconsistent use of tabs and spaces in indentation”问题的解决
- jQuery移动光标改变图像
脚本代码移动光标改变图像是一款让你通过移动光标显示和调整多个图像或其他方法来触发. 代码:http://www.huiyi8.com/sc/10628.html
- javascript(9)
js中访问函数 p1.abc() p1["abc"]; js中基于对象 == js面向对象
- Linux_异常_04_ftp: command not found...
今天在centos上使用ftp命令连接本机的FTP服务器(本机FTP服务使用Vsftpd搭建),出现如下的错误提示:-bash: ftp: command not found 查询相关资料,发现很有可 ...
- linux命令学习笔记(32):gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间. gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以 ...
- PHP留言小练习
实现功能: 留言.搜索.编辑.删除.详情页.时间.点击量 页面划分: index.html(留言列表页) add.html(留言页) edit.php(编辑页) del.php(删除页) view.p ...
- python 案例之老王开枪
- 「LuoguP1144」 最短路计数(dijkstra
题目描述 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含22个正整数N,MN,M,为图的顶点数与边 ...
- Spring boot 学习 五:domain的定义
一 public class City implements Serializable 实现了Sericalizable接口,只是一种标志.表示可以被序列化. java的ObjectOutputStr ...
- linux 安装SSH Server + FTP Server(openssh-server + vsftp)
openssh-server (推荐. 一般ssh,ftp 都是单独的,但是这个包含2个) 默认ubuntu 已经安装了, ssh client ,ftp client dpkg -l | grep ...