JSP_客户端请求,表单处理,过滤器,cookies处理
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP_客户端请求,表单处理,过滤器,cookies处理相关的知识,希望对你有一定的参考价值。
文章目录
JSP_客户端请求
- 当浏览器请求网页时,它会向Web服务器发送大量信息。这些信息不能直接读取,因为这些信息作为HTTP请求标头的一部分。
重要的http请求头信息
Cookie
请求头将返回给先前发送到服务器的cookie到浏览器。Host
请求头指定原始URL中给出的主机和端口。Connection
请求头指示客户端是否可以处理持久的HTTP连接。 持久连接允许客户端或其他浏览器通过单个请求检索多个文件。如果是Keep-Alive值表示使用持久连接。
JSP_HttpServletRequest对象
request
对象是javax.servlet.http.HttpServletRequest
对象的一个实例。 每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求HttpServletRequest
请求对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP
头信息的方法。HttpServletRequest
对象代表Web服务器的客户端请求。
JSP_HTTP头请求示例
- 使用
HttpServletRequest
对象的getHeaderNames()
方法来读取HTTP头信息的示例 getHeaderNames
返回包含与当前HTTP请求相关联的头信息的枚举。
创建index.jsp内容如下
head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>客户端请求参数数据</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>客户端请求头参数数据示例</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th>
<th>Header Value(s)</th>
</tr>
<%
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");
}
%>
</table>
</div>
</body>
JSP_服务器响应
- 当Web服务器响应HTTP请求时,响应通常由状态行,一些响应头,空行和文档组成。
HttpServletResponse对象
response
对象是javax.servlet.http.HttpServletResponse
对象的一个实例。就像服务器创建请求对象一样,它还创建一个对象来表示对客户端的响应。response
对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。
使用setIntHeader()方法设置Refresh头来模拟数字时钟
<body>
<div style="margin: auto; width: 80%;">
<h2>自动刷新HTTP标头示例</h2>
<%
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 3);
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if (calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour + ":" + minute + ":" + second + " " + am_pm;
out.println("Current Time is: " + CT + "\\n");
%>
</div>
</body>
JSP_表单处理
- 当需要从浏览器将一些传递到Web服务器的信息处理并最终传递到后端程序时,可能会遇到一些情况。浏览器使用两种方法将此信息传递到Web服务器。
GET或POST
GET方法
GET
方法将附加的用户数据信息编码并发送到请求的页面。页面和编码信息被分隔符 - ?字符分隔开
http://www.baidu.com/hello?key1=value1&key2=value2
- GET方法是将信息从浏览器传递到Web服务器的默认方法,它生成一个长字符串,出现在浏览器的地址栏框中。如果有密码或其他敏感信息传递到服务器,建议最好不要使用GET方法
- GET方法具有大小限制:请求字符串中最多只能有1024个字符。
- 可以使用
getQueryString()和getParameter()
方法来处理请求对象。
POST方法
- 通常更可靠的将信息传递给后端程序是使用POST方法。
POST方法与GET方法将信息打包的方式完全相同
,而不是将使用?
作为分隔符组成文本字符串并在URL中发送。 此消息以标准输入的形式发送到后端程序,可以解析并用于处理。- JSP使用
getParameter()
方法处理这种类型的请求,以读取简单参数的值,而getInputStream()
方法来读取客户端的二进制数据流。
使用JSP读取表单数据
getParameter()
- 调用request.getParameter()
方法来获取表单参数的值。getParameterValues()
- 如果参数出现多次并返回多个值(例如复选框),则调用此方法。getParameterNames()
- 如果想要当前请求中的所有参数的完整列表,则调用此方法。getInputStream()
- 调用此方法读取客户端的二进制数据流。
GET使用URL示例
- 将使用GET方法将两个值传递给
HelloForm
程序。 http://localhost:8080/FormProcessing/main.jsp?username=maxsu&email=ryx@163.com
- index.jsp内容
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用GET方法读取URL请求数据</title>
</head>
<body>
<h1>使用GET方法读取URL请求数据</h1>
<ul>
<li><p>
<b>UserName:</b>
<%=request.getParameter("username")%>
</p></li>
<li><p>
<b>Email:</b>
<%=request.getParameter("email")%>
</p></li>
</ul>
</body>
</html>
GET方法处理表单数据
index.jsp
提交按钮传递两个值的示例。这里使用hello.html来处理这个输入
<html>
<head>
<meta charset="UTF-8">
<title>用户表单处理</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<form action="index.jsp" method="GET">
用户名: <input type="text" name="username"> Email: <input
type="text" name="email" /> <input type="submit" value="提交" />
</form>
</div>
</body>
</html>
POST方法处理表单元素
- 使用GET或POST方法处理由Web浏览器给出的输入JSP程序:index.jsp。
<title>使用Post方读取请求数据</title>
</head>
<body>
<h1>使用Post方读取表单数据</h1>
<ul>
<li><p>
<b>UserName:</b>
<%=request.getParameter("username")%>
</p></li>
<li><p>
<b>Email:</b>
<%=request.getParameter("email")%>
</p></li>
</ul>
</body>
<title>用户表单处理</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<form action="index.jsp" method="post">
用户名: <input type="text" name="username"> Email: <input
type="text" name="email" /> <input type="submit" value="提交" />
</form>
</div>
</body>
JSP_处理复选框数据
- 当表单数据需要多个选项时,可使用复选框。以下是具有两个复选框的表单的示例HTML代码:
<html>
<head>
<meta charset="UTF-8">
<title>复选框数据处理示例</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>选择课程(多选)</h2>
<form action="index.jsp" method="POST">
<input type="checkbox" name="maths" checked="checked" /> 数学 <input
type="checkbox" name="physics" /> 物理 <input type="checkbox"
name="chemistry" checked="checked" /> 化学 <input
type="submit" value="选择提交" />
</form>
</div>
</body>
</html>
index.jsp
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>复选框数据处理示例</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>复选框数据处理示例</h2>
<ul>
<li><p>
<b>数学:</b>
<%=request.getParameter("maths")%>
</p></li>
<li><p>
<b>物理:</b>
<%=request.getParameter("physics")%>
</p></li>
<li><p>
<b>化学:</b>
<%=request.getParameter("chemistry")%>
</p></li>
</ul>
</div>
</body>
</html>
JSP_读取所有表单数据
- 使用
HttpServletRequest的getParameterNames()
方法读取所有可用的表单参数的通用示例,此方法返回一个枚举,其中包含未指定顺序的参数名称。 - 当有了返回的枚举后,就可以使用标准方式循环枚举,使用
hasMoreElements()
方法来确定何时停止并使用nextElement()
方法来获取每个参数名称。
index.html
<title>获取所有表单数据</title>
</head>
<body>
<body>
<div style="margin: auto; width: 80%;">
<h2>选择课程(多选)</h2>
<form action="index.jsp" method="POST">
<input type="checkbox" name="maths" checked="checked" value="math"/> 数学 <input
type="checkbox" name="physics" value="phys"/> 物理 <input type="checkbox"
name="chemistry" checked="checked" value="chem"/> 化学 <input type="submit"
value="选择提交" />
</form>
</div>
</body>
index.jsp样例内容
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取所有表单数据</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>获取所有表单数据</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Param Name</th>
<th>Param Value(s)</th>
</tr>
<%
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\\n");
String paramValue = request.getParameter(paramName);
out.println("<td> " + paramValue + "</td></tr>\\n");
}
%>
</table>
</div>
</body>
</html>
JSP_过滤器
- 过滤器用于在客户端访问后端的资源之前拦截请求,在服务器发送回客户端之前操纵响应
- 过滤器部署在部署描述符文件
web.xml
中,然后映射到应用程序部署描述符中的servlet或JSP名称或URL
模式。 - 部署描述符文件
web.xml
可以在<Tomcat-installation-directory>\\conf
目录中或在项目的WEB-INF
目录下找到。
过滤器的方法
- 过滤器只是一个实现
javax.servlet.Filter
接口的Java类 public void doFilter (ServletRequest, ServletResponse, FilterChain)
:在链末端的客户端请求,所以每当通过链路传递请求/响应对时,容器就会调用此方法public void init(FilterConfig filterConfig)
方法由Web容器调用,向过滤器指示它正在投入使用。public void destroy()
由Web容器调用以向过滤器指示它正在停用服务。
JSP_过滤器样例
- 显示了客户访问任何JSP文件时,打印客户端的IP地址和当前日期时间
这是bean类的内容
package com.yiibai;
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
//Implements Filter class
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// Get init parameter
String testParam = config.getInitParameter("test-param");
// Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws java.io.IOException, ServletException {
// Get the IP address of client machine.
String ipAddress = request.getRemoteAddr();
// Log the IP address and current timestamp.
System.out.println("IP " + ipAddress + ", Time " + new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request, response);
}
public void destroy() {
/*
* Called before the Filter instance is removed from service by the web
* container
*/
}
}
web.xml中的JSP过滤器的映射
- 过滤器需要先定义,然后映射到URL或JSP文件名,与Servlet定义的方式大致相同,然后映射到web.xml文件中的URL模式。
- 在部署描述符文件web.xml中为过滤器标签创建以下标签项 -
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</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>
- 上述过滤器将适用于所有servlet和JSP,因为我们在配置中指定了/*。如果要仅在少数servlet或JSP上应用过滤器,则可以指定特定的servlet或JSP路径。
JSP_cookies处理
- Cookie是存储在客户端计算机上的文本文件,它们用于各种信息的跟踪
- JSP支持使用底层的cookies处理技术
cookies识别和返回用户信息有三个步骤
- 服务器脚本将一组Cookie发送到浏览器。例如姓名,年龄或身份证号等
- 浏览器将此信息存储在本地机器上以备将来使用。’
- 当下一次浏览器向Web服务器发送任何请求时,浏览器将这些cookie信息发送到服务器,服务器使用该信息来识别用户,或者也可以用于其他目的。
jsp设置Cookies
- 创建一个cookies对象,指定Cookie名称和Cookie值调用Cookie构造函数,这两者都是字符串
Cookie cookie = new Cookie("key","value");
注意:名称和值都不应包含空格或[ ] ( ) = , " / ? @ : ;
- 设置最大有效时间:可以使用
setMaxAge
指定cookie应该有效的时间(以秒为单位)。以下代码将设置一个24小时有效时间的cookie
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);
- 将Cookie发送到HTTP响应头使用
response.addCookie
在HTTP响应标头中添加Cookie
,
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
JSP_操作Cookies案例
- 现将用户提交上来的用户名和Email设置到cookie中,并返回到客户端浏览器
index.jsp内容:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>接收表单并设置Cookies</title>
</head>
<body>
<%
Cookie cookie1 = new Cookie("username", request.getParameter("username"));
Cookie cookie2 = new Cookie("email", request.getParameter("email"));
cookie1.setMaxAge(60 * 60 * 24);
cookie2.setMaxAge(60 * 60 * 24);
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
<div style="margin: auto; width: 80%;">
<center>
<h2>设置Cookies</h2>
</center>
<ul>
<li><p>
<b>用户名:</b>
<%=request.getParameter("username")%>
</p></li>
<li><p>
<b>Email:</b>
<%=request.getParameter("email")%>
</p></li>
</ul>
</div>
</body>
</html>
创建另一个显示表单的html文件,main.jsp 内容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户表单</title>
</head>
<body>
<div style="margin: auto; width: 80%">
<form action="index.jsp" method="POST">
用户名: <input type="text" name="username">
Email: <input type="text" name="email" /> <input
type="submit" value="提交" />
</form>
</div>
</body>
</html>
JSP_读取Cookies
- 使用JSP读取cookie,需要通过调用
HttpServletRequest的getCookies()
方法来创建一个javax.servlet.http.Cookie
对象的数组 - 循环遍历数组,并使用
getName()和getValue()
方法来访问每个cookie和关联的值。
getCookies.jsp内容
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>读取Cookies</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<%
Cookie cookie = null;
Cookie[] cookies = null;
cookies = request.getCookies();
if (cookies != null) {
out.println("<h2>找到的Cookie名称和值</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
out.print("Name : " + cookie.getName() + ", ");
out.print("Value: " + cookie.getValue() + " <br/>");
}
} else {
out.println("<h2>没有找到cookies</h2>");
}
%>
</div>
</body>
</html>
JSP_删除Cookie
- 删除一个cookie,需要三个步骤
- 第一步:读取已存在的cookie并将其存储在Cookie对象中。
- 第二步:使用setMaxAge()方法将Cookie的过期时间设置为零,以删除现有的Cookie。
- 第三步:将此cookie添加回响应头。
删除名为usename的cookie,并且下次运行访问getcookies.jsp
时,将不再返回username的cookies
值。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>删除Cookies</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<center>
<h1>删除Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
cookies = request.getCookies();
if( cookies != null ) {
out.println("<h2>找到的Cookie名称和值</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if(cookie.getName().equals("username")) {
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("Deleted cookie: " + cookie.getName( ) + "<br/>");
}
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
} else {
out.println(
"<h2>No cookies founds</h2>");
}
%>
</div>
</body>
</html>
以上是关于JSP_客户端请求,表单处理,过滤器,cookies处理的主要内容,如果未能解决你的问题,请参考以下文章