JSP中采用Java语言作为脚本编程语言,这样一来使系统具有了强大的对象处理能力,并且可以动态的创建Web页面的内容,但Java语法在使用一个对象之前都要先将这个对象进行实例化,比较繁琐,为了简化开发,JSP提供了一些内置对象,他们由系统容器实现和管理,在JSP中不需要实例化,可以直接使用。
在JSP中共预先定义了九个这样的对象,分别是request、response、session、application、out、pageContext、config、page和execption。
一、页面请求对象request
request中封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、系统信息、请求方式和请求参数。
1、request的getParamer()方法可以获取指定参数的值,他的返回值类型是String类型,如果该值为空则返回一个null。
2、request的个体ParameterValues方法可用于返回复选框以及多选列表的值,他的返回值是一个String[]
例如:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'RequestDemo.jsp' starting page</title>
</head>
<body>
<form action="RequestTest.jsp" name="myAction" method="get">
<table>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td>
<input type="checkbox" name="hobby" value="1001" />音乐
<input type="checkbox" name="hobby" value="1002" />美术
<input type="checkbox" name="hobby" value="1003" />体育
</td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form> </body>
</html>
当提交该页面时,提交的数据将在RequestTest.jsp这个页面进行处理。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'RequestTest.jsp' starting page</title>
</head>
<body>
<%
out.print(request.getParameter("username"));
out.print(request.getParameter("password"));
String[] insterst = request.getParameterValues("hobby");
for (int i = 0; i < insterst.length; i++)
out.print(insterst[i]);
%>
</body>
</html>
当通过request对象获取请求参数时,当参数是中文时,如果不进行处理,得到的参数将会产生乱码。
解决乱码问题需要设置请求和响应的编码方式。
设置请求编码方式:request.setCharacterEncoding("utf-8");
设置响应编码方式:response.setCharacterEncoding("utf-8");
对于表单请求中出现乱码的处理方式:
get请求出现乱码 new String(s.getBytes("iso-8859-1"),"utf-8");
通过配置tomcat\conf\server.xml文档
二、客户端响应对象response
response对象用于响应客户请求,向客户端发送消息,他封装了JSP产生的响应,并发送到客户端以响应客户端的请求。
response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址重定向到不同主机上,这时在客户端浏览器上将会得到跳转地址,并重新发送请求链接,用户可以通过浏览器的地址栏中看到跳转后的地址,进行重定向操作后,request中的属性全部作废,并且开始一个新的request。
语法格式如下:
response.sendRedirect(String path);
与重定向相似的还有一个转发,转发的语法:
request.getRequestDispatcher("url").forword(request,response);
转发与重定向的区别 | 转发 | 重定向 |
URL变化 | 否 | 会 |
客户端是否发出请求 | 不会 | 会 |
是否携带请求 | 会 | 否 |
目标URL要求 | 仅本WEB应用 | 任意URL均可 |
例如:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'RequestTest.jsp' starting page</title>
</head>
<body>
<%
if(request.getParameter("username").equals("admin")){
request.setAttribute("mess", "登陆成功!");
response.sendRedirect("index.jsp");
}
else{
request.setAttribute("mess", "登陆失败");
request.getRequestDispatcher("RequestDemo.jsp").forward(request, response);
}
%>
</body>
</html>
三、Session会话对象
Session对象是由服务器自动创建的与用户请求相关的对象,服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
Session中保存数据的语法:
public void setAttribute(String name,Object value)
name表示属性名,value表示属性值。
从session中获取数据的方法:
public Object getAttribute(String name);
注意:他的返回值类型是Object类型,在获取数据时注意使用强制类型转换。
例如:客户端在index.jsp页面填写表单后提交给台的demo.jsp,如果用户填入的用户名是admin,那么demo.jsp将客户端填写的用户名写入session对象中,并且重定向到login.jsp并且实现自动登录功能。
首先看index.jsp
<%@ page language="java" contentType ="text/html; charset=utf-8" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form action="Demo.jsp" method = "post">
<table>
<tr>
<td>用户名:</td>
<td><input type = "text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password"/></td>
</tr>
</table>
<input type ="submit" name="submit" value="提交"/>
</form>
</body>
</html>
然后看他的Demo.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'Demo.jsp' starting page</title>
</head>
<body>
<%
String username = (String)request.getParameter("username");
if(username.equals("admin")){
session.setAttribute("username", username);
session.setAttribute("password", request.getParameter("password"));
response.sendRedirect("login.jsp");
}
else{
response.sendRedirect("index.jsp");
}
%>
</body>
</html>
然后再看login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
</head>
<body>
欢迎您:<%= session.getAttribute("username") %>,<br>
您的密码是:<%=session.getAttribute("password") %>
</body>
</html>
每个Session都有一个唯一的sessionid,使用session.getId();会以字符串的形式返回这个sessionid。
由于session是保存在服务器中的,因此必须定时清理,否则会使服务器负担较大,甚至造成服务器崩溃。
会话的清理有两种方式:
1、程序主动请求清楚session,例如登陆后的注销功能。
2、服务器会主动清除长时间没有再被请求的session。
程序主动请求清除session数据可以使用语句:
session.invalidate()
移除session中的某个属性:
session.removeAttribute(String name);
服务器自动清除长时间没有发送请求的session常用方法:
1、设置会话过期时间:
session.setMaxInactiveInterval(int interval);
单位是秒。
2、在web.xml中设置会话过期时间:
<session-config>
<session-timeout>30<session-timeout>
</session-config>
单位是分钟。
四、application对象
application对象用于保存所有应用程序中的公共数据,他在服务器启动时自动创建,在服务器停止时自动销毁,当application没有被销毁时,所有用户都可以共享该application对象。与session对象相比,他的生命周期更长,类似于系统的全局变量。
application对象提供了对应用程序初始化参数进行访问的方法。应用程序初始化参数在web.xml中进行设置,web.xml文件位于web应用目录下的WEB-INF目录下。在web.xml中通过<context-param>标签配置应用程序的初始化参数。
例如,在web.xml文档中配置连接MySQL数据库所需的url参数,可以通过getInitParameter(String name)方法获取。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Test</display-name>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://127.0.0.1:3306/db_database</param-value>
</context-param>
</web-app>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>读取配置文件</title>
</head>
<body>
<%=application.getInitParameter("url") %>
</body>
</html>
同时application也有setAttribute(String name,Object object)和getAttribute(String name)方法。通常使用连个方法统计网站访问人数。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'PeopleCount.jsp' starting page</title>
</head>
<body>
<%
Integer number = (Integer)application.getAttribute("count");
if ( number == null) {
number = new Integer("1");
application.setAttribute("count", number);
}else{
number = new Integer(number.intValue()+1);
application.setAttribute("count", number);
}
%>
<%=application.getAttribute("count") %>
</body>
</html>