文章目录
- JSP如何实现获取客户端请求及响应?
通过,请求与响应对象,请求与响应对象是通过内置对象存在的。
- 内置对象
内置对象(也称隐含对象,有9个):不需要预先声明就可以在脚本代码和表达式中随意使用
一、HTTP协议
针对网络上的客户端与服务器端在执行http请求的时候,遵守的一种规范。规定了客户端在访问服务器端的时候,要带上哪些东西,服务器端返回数据的时候,也要带上什么东西。
- 版本
1.0: 请求数据,服务器返回后,将会断开连接
1.1: 请求数据,服务器返回后,连接还会保持着。除客户端关闭连接。该连接有一定的时间限制,如果长时间空着,那么后面会服务器也会断掉。
1、Http请求数据
请求的数据里面包含三个部分内容 : 请求行 、 请求头 、请求体。
-
请求行
Request URL: 请求路径
Request Method: 请求方式
-
请求头
Accept: 客户端向服务器端表示,我能支持什么类型的数据。
Referer: 真正请求的地址路径,全路径
Accept-Language: 支持语言格式
User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。
Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
Accept-Encoding: gzip, deflate (压缩算法) 。
Host : 主机地址
Content-Length: 数据长度
Connection : Keep-Alive 保持连接
Cache-Control : 对缓存的操作 -
请求体
浏览器真正发送给服务器的数据,通常是键值对数据。
2、Http响应数据
响应的数据里面包含三个部分内容 : 响应行 、 响应头 、响应体。
-
响应行
Status Code: 状态码
-
响应头
Server: 服务器类型
Content-Type: 服务器返回给客户端内容类型
Content-Length: 返回的数据长度
Date: 通讯的日期,响应的时间 -
响应体
Response服务器返回的html页面等信息。
二、request、out、response对象
- request: 封装了由WEB浏览器或其它客户端生成HTTP请求的细节(参数,属性,头标和数据)
- out: 代表输出流的对象
- response: 封装了由WEB浏览器或其它客户端生成HTTP请求的细节(参数,属性,头标和数据)
- request作用域:
用户的请求周期,指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
1、request 对象及常用方法
request 对象代表来自客户端的请求信息,如在FORM表单中填写的信息,是最常用的对象。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
方法(部分) | 描述 |
---|---|
String getParameter(String strTextName) | 获取表单或URL提交信息 |
Enumeration getParameterNames() | 返回可用参数的枚举 |
String[] getParameterValues(String name) | 返回包含参数name的所有值的数组 |
更多参见:入口
2、response对象及常用方法
out 对象是JspWriter类的实例,是向客户端输出内容常用的对象。
方法(部分) | 描述 |
---|---|
print(dataType dt) | 输出Type类型的值 |
println(dataType dt) | 输出Type类型的值然后换行 |
flush() | 刷新输出流 |
3、response对象及常用方法
response对象是对客户端的响应,可以通过response对象来组织发送到客户端的数据,需要向客户端发送文字时直接使用。它是HttpServletResponse类的实例。
方法(部分) | 描述 |
---|---|
String getCharacterEncoding() | 返回响应用的是何种字符编码 |
ServletOutputStream getOutputStream() | 返回响应的一个二进制输出流 |
PrintWriter getWriter() | 返回可以向客户端输出字符的br/>一个对象 |
void setContentLength(int len) | 设置响应头长度 |
三、session、application、exception对象
1、session对象及常用方法
session对象是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication 开始,直到客户端与服务器断开连接为止,用于跟踪会话。它是HttpSession类的实例。
会话
会话是代表用户第一次进入当前系统直到退出系统或关闭浏览器,在此期间与服务器的一系列交互。
session作用域:会话期间
设置session有效时间的方法:
session.setMaxlnactivelnterval(int second)参数为秒
如果设置session有效时间为5分钟,则为:
session.setMaxlnactivelnterval(5*60);
方法(部分) | 描述 |
---|---|
long getCreation Time() | 返回SESSION创建时间 |
public String getld() | 返回SESSION创建时JSP引擎为它设的惟一ID号 |
long getLastAccessed Time() | 返回此SESSION里客户端最近一次请求时间 |
int getMaxlnactivelnterval() | 返回两次请求间隔多长时间此SESSION被取消(s) |
void setMaxlnactivelnterval() | 设置两次请求间隔多长时间此SESSION被取消(s) |
2、application
application对象实现了用户间数据的共享,可存放全局变量,可用于页面访问量统计等。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
application: 提供了关于服务器版本,应用级初始化参数和应用内资源绝对路径方式
application作用域: web容器的生命周期
方法(部分) | 描述 |
---|---|
Object getAtribute(String name) | 返回给定名的属性值 |
Enumeration getAttributeNames() | 返回所有可用属性名的枚举 |
void setAttribute(String name,Object obj) | 设定属性的属性值 |
void removeAttribute(String name) | 删除属性及其属性值 |
3、exception对象及常用方法
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。它实际上是java.lang.Throwable的对象。
<!-- 指定产生异常时跳转的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<!-- 指定该页面是异常处理页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
方法(部分) | 描述 |
---|---|
String getMessage() | 返回描述异常的消息 |
String tostring() | 返回关于异常的简短描述消息 |
void printStackTrace() | 显示异常及其栈轨迹 |
四、page、pageContext、config对象
1、page对象
page对象指向当前JSP页面本身,类似于类中的this 指针,它是java.lang.Object类的实例。page对象代表了正在运行的由JSP文件产生的类对象。
2、pageContext对象及常用方法
pagecontext 对象提供了对JSP页面内所有的对象及名字空间的访问,可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
<%= request.getParameter("name")%>
<!-- 通过pageContext.getRequest()方法实现上句 -->
<%= pageContext.getRequest().getParameter("name")%>
方法(部分) | 描述 |
---|---|
JspWriter getOut() | 返回当前客户端响应被使用的JspWriter 流(out) |
HttpSession getSession() | 返回当前页中的HttpSession对象(session) |
ServletRequest getRequest() | 返回当前页的 ServletRequest对象(request) |
Object getPage() | 返回当前页的Object对象(page) |
ServletResponse getResponse() | 返回当前页的ServletResponse对象(response) |
Exception getException() | 返回当前页的Exception对象(exception) |
ServletConfig getServletConfig() | 返回当前页的 ServletConfig对象(config) |
servletContext getServletContext() | 返回当前页的 ServletContext对象(application) |
void include(String relativeURLPath) | 在当前位置包含另一页面 |
3、config对象及常用方法
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象。
方法 | 描述 |
---|---|
ServletContext getServletContext() | 返回包含服务器相关信息的所有servletContext对象 |
getInitParameter(String name) | 获取初始化参数值 |
getInitParameterNames() | 返回 servlet初始化所需所有参数的枚举 |
-
配置JSP页面
在web.xml文件中的进行,**JSP被当成Servlet配置,**为Servlet配置参数使用init-param元素,该元素可以接受param-name和param-value分别指定参数名和参数值。
<servlet>
<!--指定servlet的名字-->
<servlet-name>config</servlet-name>
<!--指定哪一个JSP页面配置成Servlet-->
<jsp-file>/abc.jsp</jsp-file>
<!--配置名为name的参数,值为Tim-->
<init-param>
<param-name>name</param-name>
<param-value>Tim</param-value>
</init-param>
<!--配置名为age的参数,值为15-->
<init-param>
<param-name>age</param-name>
<param-value>15</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--指定将config Servlet配置到/atthis路径-->
<servlet-name>config</servlet-name>
<url-pattern>/atthis</url-pattern>
</servlet-mapping>
注意:如果希望JSP页面可以获取web.xml配置文件中的配置信息就必须通过为该JSP页面在web.xml文件中分配的路径来访问页面,因为只有这样访问JSP页面才会让配置文件起作用。
五、案例分析
1、数据类 Emp、DBUtil
// Emp类
public class Emp {
private String account;
private String name;
private String password;
private String email;
public Emp(String account, String name, String password, String email) {
this.account = account;
this.name = name;
this.password = password;
this.email = email;
}
public String getAccount() { return this.account; }
public void setAccount(String account) { this.account = account; }
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return this.password; }
public void setPassword(String password) { this.password = password; }
public String getEmail() { return this.email; }
public void setEmail(String email) { this.email = email; }
}
// DBUtil类
public class DBUtil {
public static Map<String, Emp> map = new HashMap<>();
static { //静态代码块
map.put("1001", new Emp("1001", "A1", "123", "A1@163.com"));
map.put("1002", new Emp("1001", "B2", "123", "B2@163.com"));
map.put("1003", new Emp("1001", "C3", "123", "C3@163.com"));
map.put("1004", new Emp("1001", "D4", "123", "D4@163.com"));
}
// 判断用户名和密码是否正确
public static boolean selectEmpByAccoutAndPassword(Emp emp){
boolean flage = false;
for(String key : map.keySet()){
Emp e = map.get(key);
if(emp.getAccount().equals(e.getAccount())
&& emp.getPassword().equals(e.getPassword()))
return true;
}
return false;
}
}
2、index.jsp 页面
<body>
<!--
pageContext的作用:
1、forward方法 完成请求的转发
2、include方法 实现页面之间的包含关系
3、pageContext 方法获取其他的内置对象,getRequest,getSession...
-->
<%
//pageContext.include("header.jsp");
//pageContext.forward("a.jsp?name=moc");
%>
page的基本信息:<%= this.getServletInfo()%>
<br />
<a href="/jsp/denga"> 按下</a>
</body>
3、web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>logab</servlet-name>
<jsp-file>/logon.jsp</jsp-file>
<init-param>
<param-name>age</param-name>
<param-value>10</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>logab</servlet-name>
<url-pattern>/denga</url-pattern>
</servlet-mapping>
</web-app>
4、logon.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>人事管理系统</title>
</head>
<body>
config对象:<%= config.getServletName()%>
<br>
config获得的初始化参数:<%= config.getInitParameter("age")%>
<%
// pageContext作用域只在当前作用域有效
pageContext.setAttribute("age", 12);
%>
<br>
pageContext作用域获取的值:<%= pageContext.getAttribute("age") %>
<%
request.setAttribute("name", "description");
// 将请求和响应转发给 result.jsp
//request.getRequestDispatcher("result.jsp").forward(request, response);
%>
<h3 align="center">人事管理系统登录界面</h3>
<hr>
<!-- action代表服务器端的处理程序 -->
<form action="control.jsp">
<table>
<tr>
<td>
账号:
</td>
<td>
<input type="text" name="account" />
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="password" name="password" />
</td>
</tr>
<tr>
<td>
<input type="submit" value="登录" />
</td>
</tr>
</table>
</form>
</body>
</html>
5、control.jsp页面.
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<%@ page import="moc.test01.bean.*, moc.test01.db.*" %>
<%@ page import="java.util.Map" %>
<html>
<head>
<title>人事管理系统</title>
</head>
<body>
<!-- 获取账号和密码,通过调用DBUtil当中的方法验证账号和密码的正确性
1. 正确,返回true,显示登录成功
2. 错误,返回false, 显示错误信息。
request: 获取请求信息
getParameter(String name): 可以通过表单的name属性来获取控件的值
out: 输出流对象,输出指定信息
println(): 打印输出信息并换行
-->
<!-- 以下结果为null,是因为requset的作用域 -->
从request对象中获取key为name对应的值:<%= request.getAttribute("name") %>
<!-- 获得request的编码方式 -->
<h3>响应的字符编码集:<%= response.getCharacterEncoding() %></h3>
<%
String account = request.getParameter("account");
String password = request.getParameter("password");
// out.println("账号:" + account + ", 密码:" + password);
Emp emp = new Emp(account, null, password, null);
boolean flag = DBUtil.selectEmpByAccoutAndPassword(emp);
Map<String, Emp> map = DBUtil.map;
if(flag == true){
Object o = application.getAttribute("count");
if(o == null){
application.setAttribute("count", 1);
}else{
int count = Integer.parseInt(o.toString());
application.setAttribute("count", count + 1);
}
session.setAttribute("account", account); // 账户信息放入会话作用域
%>
<h3 align="right">访问量:<%= application.getAttribute("count")%></h3>
<h3 align="right">登录账户:<%= session.getAttribute("account") %></h3>
<h3 align="center">欢迎来到人事管理系统的首页</h3>
<hr>
<table align="center" border="1" width="500px">
<tr>
<td>
账号
</td>
<td>
员工姓名
</td>
<td>
<a href="http://www.baidu.com">邮箱</a>
</td>
<td>
修改
</td>
</tr>
<%
for(String key : map.keySet()){
Emp e = map.get(key);
%>
<tr>
<td>
<%= e.getAccount() %>
</td>
<td>
<%= e.getName() %>
</td>
<td>
<%= e.getEmail() %>
</td>
<td>
<!-- 相邻两个页面传递数据,可以通过URL参数来传递
规则:
资源?key1=value1&key2=value2
-->
<a href="update.jsp?account=<%=e.getAccount()%>&name=<%=e.getName()%>&email=<%=e.getEmail()%>">修改</a>
</td>
</tr>
<%
}
%>
</table>
<%
}
else
//out.println("用户名和密码错误");
throw new Exception("账号和密码错误"); // 500
%>
</body>
</html>
6、update.jsp界面
<body>
<h3>员工更新界面</h3>
<hr>
<h3 align="right">登录账号:<%= session.getAttribute("account") %></h3>
<form action="update_data.jsp">
<table align="center" border="1" width="500px">
<tr>
<td>账号</td>
<td><input type="text" name="account" value="<%=request.getParameter("account")%>"/></td>
</tr>
<tr>
<td>姓名</td>
<td><input type="text" name="name" value="<%=request.getParameter("name")%>" /></td>
</tr>
<tr>
<td>邮箱</td>
<td><input type="text" name="email" value="<%=request.getParameter("email")%>" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit"></td>
</tr>
</table>
</form>
</body>
7、update_data.jsp页面
<body>
<%
Map<String, Emp> map = DBUtil.map;
Emp emp = map.get(request.getParameter("account"));
emp.setName(request.getParameter("name"));
emp.setEmail(request.getParameter("email"));
%>
<h3 align="center">修改员工信息成功。</h3>
</body>
8、error.jsp页面
<body>
<!---
1、exception对象只能在错误页面页面中使用,page加入一个属性isErrorPage="true"
2、有一个页面出现了异常,在页面中指定一个错误处理的页面,page指令当中,errorpage来指定。
-->
<%= exception.getMessage() %>
</body>