request
将要介绍request对象的作用范围及其常用的方法。用户每访问一个页面, 就会产生一个HTTP请求。这些请求中一般都包含了请求所需的参数值或者信息, 如果将request对象看作是客户请求的一个实例, 那么这个实例就包含了客户请求的所有数据。因此, 可以通过request来获取客户端和服务器端的信息,如IP地址、传递的参数名和参数值、应用系统名称、服务器主机名称等。
常见方法
方法 | 方法说明 |
---|---|
getParameter() | 取得请求中指定的参数值, 返回String类型, 如果有必要, 需要将取得的参数值转换为合适的类型 |
getParameterValues() | 将同名称的参数一次性地读入String类型的数组中 |
getParameterNames() | 获取参数名称,返回枚举类型 |
getMethod() | 获取客户提交信息的方式,即post或get. |
getServletPath() | 获取JSP页面文件的目录 |
getHeader() | 获取HTTP头文件中的指定值,例如accept、user-agent、content-type、content-length等 |
getRemoteAddr() | 获取客户的IP地址 |
getServeName() | 获取服务器的名称 |
getServerPort | 获取服务器的端口号 |
getContextPath | 获取项目名称,如果项目为根目录,则得到空的字符串 |
getHeaders() | 获取表头信息,返回枚举类型 |
访问http://localhost:8080/web01_war_exploded/getParameter.jsp
访问http://localhost:8080/web01_war_exploded/getParameter.jsp?name=john&city=beijing
如果修改为http://localhost:8080/web01_war_exploded/getParameter.jsp?name=john&city=%E5%8C%97%E4%BA%AC
也可以正常显示
post请求,新建posttest.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="getParameter.jsp" method="post">
<table>
<tr>
<td>姓名</td>
<td>
<input type="text" placeholder="请输入姓名" name="name">
</td>
</tr>
<tr>
<td>城市</td>
<td>
<input type="text" placeholder="请输入所在城市" name="city">
</td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
可以看到乱码了
两种方式处理乱码问题
乱码问题
第一种方式
getParameter.jsp增加请求字符串编码设置
<%request.setCharacterEncoding("utf-8");%>
getParameter.jsp增加获取字符串时编码重新编码
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "utf-8");
String city = new String(request.getParameter("city").getBytes("ISO-8859-1"), "utf-8");
第3种方法, 通过编写一个Servlet过滤器来解决中文乱码问题, 并可以通过配置让过滤器解决所有请求处理字符集的问题,请求处理页面就不用关心字符集处理了。第3种方法可以有效防止上述问题且移植性强。
获取请求的头部信息
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取请求头的头部信息</title>
</head>
<body>
<%
Enumeration<String> enumeration =request.getHeaderNames();
while (enumeration.hasMoreElements()){
String name = enumeration.nextElement();
String value = request.getHeader(name);
if(value==null||"".equals(value)){
value="空字符串";
}
%>
<p>表头名称:<%=name%>,对应的值:<%=value%></p>
<%}%>
</body>
</html>
get请求
post请求
获取主机和客户机的信息
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>本地机器信息:</h1>
<p>
本地机器ip:<%=request.getLocalAddr()%>
</p>
<p>
本地机器名称:<%=request.getLocalName()%>
</p>
<p>
本地机器端口:<%=request.getLocalPort()%>
</p>
<h1>客户机信息:</h1>
<p>
客户主机ip:<%=request.getRemoteAddr()%>
</p>
<p>
客户主机名称:<%=request.getRemoteHost()%>
</p>
<p>
客户主机端口:<%=request.getRemotePort()%>
</p>
<h1>服务器信息</h1>
<p>
服务器ip:<%=request.getServerName()%>
</p>
<p>
服务器端口:<%=request.getServerPort()%>
</p>
<p>
网页地址:<%=request.getServletPath()%>
</p>
</body>
</html>
response
当用户访问一个页面时, 就会产生一个HTTP请求,服务器做出响应时调用的是response 响应包。response 响应包实现的是接口javax.servlet.http.HttpServletResponse。
常用方法
方法 | 方法说明 |
---|---|
addHeader(String name,String value) | 向页面中添加头和对应的值 |
addCookie(Cookie cookie) | 添加Cookie信息 |
sendRedirect(String uri) | 实现页面重定向 |
setStatus(int code) | 设定页面的响应状态代码 |
setContentType(String type) | 设定页面的MIME类型和字符集 |
setCharacterEncoding(String charset) | 设定页面响应的编码类型 |
setHeader(String name,String value) | 设置请求头 |
设置头信息
设置头信息包括设置页面返回的MIME类型、返回的字符集、页面中的meta等信息。其中设置MIME类型和返回的字符集尤为重要, 因为它关系到页面的显示是否会出现乱码。有两种方法用于设置MIME类型和返回的字符集, 分别如下:
- response.set ContentType(Stringtype) :其中type的值为“text/html; charset=utf-8”, 当然也可以为其他的MIME类型和字符集。
- page 指令:基本固定格式为“<%@page contentType="text/html; charset=utf-8"language=“java”%>”
<%
response.setContentType("text/html;charset=UTF-8");
String str = new String("这是测试例子".getBytes("ISO-8859-1"), "utf-8");
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>这是一段中文字符</p>
<hr>
<%=str%>
</body>
</html>
从运行结果可以看出, 脚本中经过转码的文字显示正常, 但在HTML中的字却是乱码。使用page指令设定字符集时, 在写法和处理上都相对简单些, HTML中的中文字不需要转码,而且脚本中的中文字也不需要转码。
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
String str = "这是测试例子";
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>这是一段中文字符</p>
<hr>
<%=str%>
</body>
</html>
设置头meta信息是指在HTML页面中存在于之间的信息。例如:
- <meta http-equiv="pragma"content=“no-cache”>:设定禁止浏览器从本地缓存中调取页面内容, 设定后离开网页就不能从Cache中再调用。
- <meta http-equiv="cache-control"content=“no-cache”>:请求和响应遵循的缓存机制策略。<meta http-equiv="expires"content=“O”>:用于设定网页的到期时间,一旦过期就必须到服务器上重新调用。
- <meta http-equiv="keywords"content=“keyword 1, keyw ord 2, keyword 3”>:向搜索引擎说明网页的关键字。
- <meta http-equiv="description"content=“This is my page”>向搜索引擎说明网页的主要内容。
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>
现在时间是:
<%
out.print(""+new Date());
response.setHeader("refresh","1");
response.setHeader("descirption","实时显示当前时间");
response.setHeader("keywords","实时显示当前时间");
response.setHeader("cache-control","no-cache");
%>
</p>
</body>
</html>
页面重定向
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>
<%
response.sendRedirect("/index.jsp");
%>
</p>
</body>
</html>
session
在Web开发中,session对象同样占据着极其重要的位置,它是一个非常重要的对象,可以用
来判断是否为同一用户,还可以用来记录客户的连接信息等。HTTP协议是一种无状态的协议(不
保存连接状态的协议),每次用户请求在接收到服务器的响应后,连接就关闭了,服务器端与客户
端的连接被断开,因此,如果用户的浏览器还没关闭时又发起请求,那么网站就应该识别出该用户
的情况。在这种情况下,session对象就起到了关键作用。
相关概念
名称 | 说明 |
---|---|
会话 | 从用户打开浏览器连接到一个Wb应用或者是某个界面,直至关闭浏览器这个过程称为一个会话。其实打开一个浏览器就意味着打开了一个会话对象 |
session对象生命周期 | 从用户访问某个页面到关闭浏览器这段时间称为session对象的生命周期,也可以说从会话开始到结束这段时间为session对象的生命周期 |
session对象与Cookie | session对象与Cookie对象是一一对应关系。JSP引擎会将创建好的session对象存放在对应的Cookie中 |
常见方法
方法 | 说明 |
---|---|
void setAttribute(String name,Object value) | 将参数名和参数值存放在session对象中 |
Object getAttribute(String name) | 返回session中与指定参数绑定的对象,如果不存在就返回null |
Enumeration getAttributeName() | 一个用户一个线程,从而保证多个用户单击同一页面时session对象的唯一性 |
String getld() | 获取session对象的ID值 |
void removeAttribute(String name) | 移除session中指定名称的参数 |
long getCreationTime() | 获取对象创建的时间,返回结果是long型的毫秒数 |
int getMaxInactivelnterval() | 获取session对象的有效时间 |
void setMaxInactivelnterval() | 设置session对象的有效时间 |
boolean isNew() | 用于判断是否为一个新的客户端 |
void invalidate() | 使session对象不合法,即失效 |
获取sessionid
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html>
<body>
<%
String sessionId = session.getId();
session.setAttribute("name","john");
String author = (String)session.getAttribute("author");
long time = session.getCreationTime();
Date date = new Date(time);
%>
<p>您访问的是index.jsp</p>
<%=author%>,您的sessionid为<%=sessionId%>
<br>
<p>
session对象的创建时间为:<%=date%>
</p>
<form action="index02.jsp" method="post">
<input type="submit" value="跳转index02.jsp">
</form>
<a href="index03.jsp">跳转index03.jsp</a>
</body>
</html>
index02.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html>
<body>
<%
String sessionId = session.getId();
String author = (String)session.getAttribute("name");
long time = session.getCreationTime();
Date date = new Date(time);
%>
<p>您访问的是index02.jsp</p>
<%=author%>,您的sessionid为<%=sessionId%>
<br>
<p>
session对象的创建时间为:<%=date%>
</p>
<form action="index.jsp" method="post">
<input type="submit" value="跳转index.jsp">
</form>
<a href="index03.jsp">跳转index03.jsp</a>
</body>
</html>
index03.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html>
<body>
<%
String sessionId = session.getId();
String author = (String)session.getAttribute("name");
session.setAttribute("name","smith");
long time = session.getCreationTime();
Date date = new Date(time);
%>
<p>您访问的是index03.jsp</p>
<%=author%>,您的sessionid为<%=sessionId%>
<br>
<p>
session对象的创建时间为:<%=date%>
</p>
<form action="index.jsp" method="post">
<input type="submit" value="跳转index.jsp">
</form>
<a href="index02.jsp">跳转index02.jsp</a>
</body>
</html>
点击跳转index02.jsp
点击跳转index03.jsp
点击跳转index.jsp
用户登录信息保存
login.jsp
<%@ page language="java" pageEncoding="utf-8" import="java.util.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>登录页面</title>
</head>
<body>
<h1>用户登录页面</h1>
<form action="validate.jsp" method="post">
用户名称:
<input type="text" name="username">
<br>
用户密码:
<input type="password" name="pwd">
<br>
<input type="submit" value="登录">
</form>
</body>
</html>
validate.jsp
<%@ page language="java" pageEncoding="utf-8" import="java.util.*" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>验证页面</title>
</head>
<body>
<%!
//声明一个用户集合,模拟从数据库中取出数据
Map<String,String> map =new HashMap<String,String>();
//声明验证的标识
boolean flag = false;
%>
<%
//像集合中添加数据
map.put("John","123456");
map.put("Smith","123456");
map.put("Bob","123456");
map.put("Bruth","123456");
%>
<%!
/**
* 声明验证方法
* @param username
* @param password
* @return
*/
boolean validate(String username,String password){
String pwd = map.get(username);
if(password!=null&&password.equals(pwd)){
return true;
}
return false;
}
%>
<%
//获取页面提交的用户名与密码
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
if(username==null||username==""||pwd==null||pwd==""){
response.sendRedirect("login.jsp");
return;
}
flag = validate(username,pwd);
if(flag){
//保存到session中
session.setAttribute("username",username);
session.setAttribute("pwd",pwd);
response.sendRedirect("class.jsp");
}
%>
<%if(flag){%>
<p>用户登录</p>
<%}else{%>
<a href="login.jsp">重新登录</a>
<%}%>
</body>
</html>
class.jsp
<%@ page language="java" pageEncoding="utf-8" import="java.util.*" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>班级管理页面</title>
</head>
<body>
<%
String name = (String) session.getAttribute("username");
if (name == null) {
response.sendRedirect("login.jsp");
}
%>
<table>
<tr>
<td>姓名</td>
<td>小明</td>
</tr>
<tr>
<td>年龄</td>
<td>18</td>
</tr>
</table>
<a href="logout.jsp">退出登录</a>
</body>
</html>
logout.jsp
<%@ page language="java" pageEncoding="utf-8" import="java.util.*" %>
<%
session.removeAttribute("username");
session.invalidate();
response.sendRedirect("login.jsp");
%>
退出登录即可
application
application对象实现的接口为javax.servlet.ServletContext,它的生命周期是从application对象创建到应用服务器关闭, 也就是说当服务器关闭时application对象才消失。可以将它视为Web应用的全局变量,当服务器运行时有效,如果关闭服务器,其中保存的信息也就消失了。
方法 | 解释 |
---|---|
getAttribute(String name) | 获得存放在application中的含有关键字为name的对象 |
setAttribute(String name, Object obj) | 将关键字name的指定对象obj放进application对象中 |
Enumeration getAttribute Names() | 获取application中所有参数的名字, 返回值是枚举类型 |
removeAttribute(String name) | 移除application对象中name指定的参数值 |
getServlet Info() | 获取Servlet的当前版本信息 |
getContext(String uri path) | 获取uri path指定路径的context内容 |
getRealPath(String path) | 获取指定文件的实际路径 |
getMimeType(String file) | 获取指定的文件格式 |
获取指定页面的路径
<%@page import="java.util.*" pageEncoding="utf-8" language="java" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>获取指定页面的路径</title>
</head>
<body>
<p>
当前服务器版本和名称:
<%=application.getServerInfo()%>
</p>
<p>
当前页面jsp的实际路径:
<%=application.getRealPath("index.jsp")%>
</p>
<p>
当前页面的URL:
<%=application.getResource("index.jsp")%>
</p>
<p>
当前web程序的路径:
<%=application.getContextPath()%>
</p>
</body>
</html>
设计一个网页计数器
<%@page import="java.util.*" pageEncoding="utf-8" language="java" %>
<%
Integer count = (Integer) application.getAttribute("count");
if (count == null) {
count = 1;
} else {
count++;
}
application.setAttribute("count", count);
%>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网站计数器</title>
</head>
<body>
<p>欢迎访问本网站,您是第<%=count%>位访问用户!</p>
</body>
</html>
out
方法 | 方法说明 |
---|---|
append(char c) | 将字符添加到输出流中 |
clear() | 清空页面缓存中的内容 |
close() | 关闭网页流的输出 |
flush() | 网页流的刷新 |
println() | 将内容直接打印在HTML标记中 |
write() | 与println()方法相似,区别在于println()方法可以输出各种类型的数据,而write方法只能输出与字符相关的数据,例如字符、字符数组、字符串等 |
输出html
<%@page import="java.util.*" pageEncoding="utf-8" language="java" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Out输出内容</title>
</head>
<body>
<%
out.println("<h1>");
out.println("out输出内容");
out.println("</h1>");
%>
</body>
</html>
clear方法
<%@page language="java" pageEncoding="utf-8" import="java.util.*" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>out Clear方法</title>
</head>
<body>
<h1>这是html中的内容</h1>
<%
out.println("<h1>这是out内容</h1>");
//清除数据
out.clear();
%>
<h1>这是html中的内容!!</h1>
</body>
</html>
page
page对象的实质是java.lang.Object对象,它代表转译后的Servlet.。page对象是指当前的JSP页面本身,在实际开发中并不常用。
常见方法
方法 | 解释 |
---|---|
getClass() | 返回当时被转译的Servlet类 |
hashCode() | 返回此时被转译的Servlet类的哈希代码 |
toString() | 将此时被转译的Servlet类转换成字符串 |
equals(Object obj) | 比较此时的对象是否与指定的对象相等 |
clone() | 将此时的对象复制到指定的对象中 |
copy(Object obj) | 对指定对象进行克隆 |
案例
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Page页面</title>
</head>
<body>
<%
int code = page.hashCode();
String str = page.toString();
out.println("page对象的hash码:"+code);
out.println("page对象的字符串:"+str);
%>
</body>
</html>
config
config对象实现了javax.servlet.ServletConfig接口,它一般用于在页面初始化时传递参数。
常见方法
方法 | 解释 |
---|---|
getlnitParameter(String arg0) | 获得指定的初始化值 |
getServletName() | 获得Servlet名字 |
getServletContext() | 获得ServletContext值 |
equals(Object obj) | 比较此时的对象是否与指定的对象相等 |
getInitParameterNames() | 获得初始化值的枚举值 |
toString() | 获得此对象的值 |
案例
修改WEB-INF下的web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>jspconfigdemo</servlet-name>
<jsp-file>/config.jsp</jsp-file>
<init-param>
<param-name>url</param-name>
<param-value>http://www.baidu.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jspconfigdemo</servlet-name>
<url-pattern>/config.jsp</url-pattern>
</servlet-mapping>
</web-app>
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%
String url = config.getInitParameter("url");
String str = config.toString();
out.println("config对象的initParameter方法"+url+"<br/>");
out.println("config对象的toString方法"+str+"<br/>");
%>
</body>
</html>