什么是JSP内置对象
JSP内置对象,就是在编写JSP页面时,不需做任何声明就可以直接使用的对象。
例如如下代码:
int[] value={20,30,10,};
for(int i : value){
out.print(i);
}
代码out.print()可以实现页面输出,因为out是JSP内置对象之一。该方法用于在页面中显示字符串信息。
所谓内置对象就是由Web容器加载的一组Servlet API的实例,这些实例由JSP规范进行了默认的初始化操作,可以世界在jSP中使用。需要注意,JSP的内置对象名称均是JSP保留字,不得当作自定义变量名使用。
内置对象request
1.request对象
request对象是最常用的JSP内置对象之一,其中包含了有关浏览器请求的信息:
可以在JSP页面中通过调用request对象的方法来获取请求中的相关数据及浏览器的相关信息,request对象用于处理请求的方法有很多:
示例:request方法使用:
<%
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
String[] channels=request.getParameterValues("channel");
%>
代码说明:
(1)request的getparameter()方法是最为常用的,使用此方法可以获得请求中所提交的参数值。
(2)如果在页面中出现了多个复选框,复选框名称都是channels,则使用getParameterVlaues(“channel”)方法就可以获取一个字符串数组,该数组中存储的是所有选中的复选框对应的值。
(3)request对象的setCharacterEncoding()方法用于设置字符集,可以用来解决中文乱码的问题。在Web应用中,通常都包括了浏览器,Web服务器,Web应用程序和数据库等部分,每一部分都可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时,出现乱码问题。
中文乱码问题
以POST方法提交表单数据中有中文字符时
注意:页面和浏览器请求也应一致使用UTF-8编码,通过JSP页面设置page指令的contentType属性,指定页面内容和编码格式,语法如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
以GET方法提交表单数据中有中文时
当采用get犯法提交表单数据时,提交的数据作为查询字符串被附加到URL的末尾发送到服务器,对于这部分数据,在服务器端调用setCharacterEncoding()方法是不起作用的,我们需要得到请求参数值后,进行编码转换。
在Tomcat中设置字符集
当采用GET方法提交时,还可以配置Tomcat的字符集,配置方式:找到Tomcat目录结构\conf\server.xml文件,在Connector元素中添加URLEncoding属性,将它的值设为UTF-8.
如果在Tomcat中设置了字符集编码,对于浏览器以GET方式提交的数据无须在JSP页面中在进行编码处理。
内置对象response
JSP中包含了多个内置对象,各自有不同的功能,与request相应的是response对象,response对象可用于设置相应参数及取得响应等,
与request方法一样,response对象也提供了多个方法用于处理HTTP响应
方法名称 | 说明 |
---|---|
void addCookie(Cookie cookie) | 向客户端添加Cookie |
void setContentType(String type) | 设置HTTP响应的contenttype类型 |
void setCharacterEncoding(String charset) | 设置响应所采用的字符编码类型 |
void sendRedirect(String location) | 将请求重新定位到一个新的URL上 |
最常用的方法是void sendRedirect(String location)这个方法用于将请求重新定向到一个新的URL上。
示例:
登录页面代码login.jspr如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="control.jsp" name="form1" method="post">
用户名:<input type="text" name="userName">
密码:<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
</body>
</html>
登录处理页面代码control代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录处理页面</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("userName");
String pwd=request.getParameter("pwd");
if("sa".equals(name) && "sa".equals(pwd)){
response.sendRedirect("welcome.jsp");
}
%>
</body>
</html>
欢迎页面welcome.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
欢迎进入本页面
</body>
</html>
如果希望当登录成功后,在欢迎页面显示登录用户的名称,该怎么办?
如果要在welcome.jsp中显示用户名,可尝试按此方法修改welcome.jsp的代码:如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
<%
String name=request.getParameter("uname");
%>
欢迎<%=name %>进入本页面
</body>
</html>
查看运行效果,显示显示 欢迎null进入本页面,与设想的完全不一样,这是什么原因呢?下面将解决这个问题
转发与重定向
首先control.jsp示例代码进行修改:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录处理页面</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("userName");
String pwd=request.getParameter("pwd");
if("sa".equals(name) && "sa".equals(pwd)){
request.getRequestDispatcher("wolcome.jsp").forward(request,response);
}
%>
</body>
</html>
再次运行,就获取了用户的信息,要明白其中的道理,就必须了解下面内容:jsp页面的转发与重定向。
什么是转发
从程序运行的角度理解,即当客户端发送一个请求到服务器后,web服务器在容器内部完成请求跳转,然后将最终的结果发送给浏览器,整个过程都是在服务器内部完成的。而对应到客户端,无论服务器内如何处理,作为浏览器都只是提交了一个请求,因而客户端的URL地址不会改变。
2.什么是重定向
当用户成功登录后,使用的是response对象的sendRedirect()方法。那么该方法的执行结果是客户端重新向服务器请求一个地址链接,由于发送新的请求,因而上次请求中的数据将随之丢失,这种行为称为重定向。由于服务器重新定向了URL,因此在客户端浏览器显示的是新的URL地址,所以重定向可以理解为浏览器至少提交了两次请求。
如果需要在重定向的情况下将简单的数据(值类型,字符串)传递至目标页面,可以使用查询字符串代码如下:
response.sendRedirect("welcome.jsp?uname="+name);
查询字符串
除了在重定向中的应用外,在实际应用中,还有一种情况也经常用到查询字符串,那就是超链接。在日常浏览网页信息时,会发现在网页中有很多超链接,用户单击这些超链接将会跳转到一个新的页面,显示相关的信息。
示例:了解如何使用查询字符串实现数据传递:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
请从以下7种颜色中,选择你最喜欢的颜色
<a href="color.jsp?color=赤色">赤色</a>
<a href="color.jsp?color=橙色">橙色</a>
<a href="color.jsp?color=黄色">黄色</a>
<a href="color.jsp?color=绿色">绿色</a>
<a href="color.jsp?color=青色">青色</a>
<a href="color.jsp?color=蓝色">蓝色</a>
<a href="color.jsp?color=紫色">紫色</a>
</body>
</html>
结果显示页面,color.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>喜欢的颜色</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String color=request.getParameter("color");
%>
你从喜欢的颜色是<%=color%>
</body>
</html>
分析以上代码:会发现在跳转页面的后面都有一个?,以及一个参数名color,每一个参数的值就是所选择的颜色。而在结果页面中使用request对象的getParamenter()方法,就可以获取到参数color的值。
注意:
使用超链接进行数据传输时,采用的时GET方式提交请求。中文乱码的问题可以使用new String(需要编码的数据.getbytes())进行重新编码。也可以设置tomcat字符集实现
当传递多个数据时,可以用“&”连接,例如:color=黄色&id=1;在获取数据时,依然可以通过参数名id读取参数值“1”,
JSP内置对象session
一个用户的活动会发生多次请求与响应,作为服务器而言,必须有一种机制来标识一个用户,同时记录该用户的状态信息。这就是会话跟踪极致,该机制可以保持每个用户的会话信息,为不同的用户保存自己的数据。
什么是会话
会话机制是一种服务器端的机制,当用户向服务器发出第一次请求时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。
当服务器接受到客户端的请求时,服务器首先会判断是否已经创建与该客户端对应的会话,如果已经创建,就将该请求与此会话关联。如果没有创建,则创建一个新会话。
而服务器判断是否创建了相关会话,是通过一个唯一的标识sessionid来实现的。如果在客户端的请求中包含了一个sessionid,则说明在此前已经为客户端创建了会话,服务器就会根据这个sessionid将对应的会话对象读取出来,否则就会创建一个新的会话对象并生成一个sessionid,并将sessionid在本次响应的过程返回客户端保存。
session对象
作为JSP提供的内置对象之一,session对象允许用户访问会话的相关信息,以及绑定数据到会话。绑定到会话的数据可以在多次请求之间持续有效。 session对象的常用方法如下:
使用session对象实现权限控制
在网上冲浪时,不少人会有这样的经历,好不容易找到了一本好看的电子书的下载网址,在点击下载时,系统会自动转入登录页面,提示用户登录网站。当然,如果时已经登录用户,就不会i面临这样的问题了。那么,系统时如何判断用户是否已经登录过该网站的呢?
这里要实现的权限访问控制是基于session对象来完成的。
下面使用session为新闻发布系统增加访问控制。
示例:以一个管理员登录示例为例,实现访问控制的功能
登录处理页面dologin.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录处理页面</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
//获取请求数据
String name=request.getParameter("userName");
String pwd=request.getParameter("pwd");
boolean valid=false; //判断用户是否验证成功
if("admin".equals(name) && "admin".equals(pwd)){
valid=true;
//设置用户登录信息
session.setAttribute("login", name);
//设置会话过期时间
session.setMaxInactiveInterval(10*60);
}
if(valid){
request.getRequestDispatcher("admin.jsp").forward(request, response);
}else{
response.sendRedirect("index.jsp");
}
%>
</body>
</html>
接下来在管理员页面加入登录验证,从session中提取用户的信息,如果用户信息不存在,则跳转到登录页面 这一步实现了访问控制 。
也许有人会问,在登录处理页面中,已经实现了对用户身份的验证,为什么在此处还要在进行验证呢。原因很简单,如果用户不通过登录方式,而是直接在浏览器地址栏中输入管理员页面的地址,这样会直接绕过登录限制而访问成功,所以需要在管理员页面在添加控制语句
在管理员操作页面admin.jsp中加入如下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String login=(String) session.getAttribute("login");
if(login==null){
response.sendRedirect("index.jsp");
return;
}
%>
如果直接在浏览器地址栏中输入管理员页面的地址,系统会自动跳转到登录页面,提示用户进行登录。这个原因很简单,因为我们在管理员页面中加入了访问控制,只有正确登录后,进入管理员操作页面,会话中才会存储用户登录成功的状态信息,才可以正常访问管理员操作页面。
每个session对象都与浏览器一一对应,也就是说,重新开启一个浏览器窗口,相当于重新创建一个session对象。但是需要注意的是,由于浏览器或版本不同,即使重新打开一个浏览器窗口,也会认为是同一个session对象,也就是所谓的出现会话共享问题,以IE8为例,可以在浏览器上执行 “文件”——“新建会话” 命令新建一个会话窗口,另外,在提供两种取消浏览器窗口共享session的方法,一种是修改IE8快捷方式:右击IE8的快捷方式图标,在弹出的快捷菜单中选择,属性——“目标” 选项,在末尾添加-nomerge;另一种是使用命令参数“iexplore.exe nomerge”打开IE。
会话的失效
会话也是右时效的,使会话失效的方式有两种 一种是会话超时,一种是手动调用方法设置失效。
会话超时是指,两次请求时间间隔超过了服务器允许的最大时间间隔,会话的超时间间隔可以通过三种方法设置。
(1)通过session对象的setMaxInactiveInterval()方法如下:
<%
//设置用户登录信息
session.setAttribute("login", name);
//设置会话过期时间 参数为秒
session.setMaxInactiveInterval(10*60);
%>
(2)在web.xml中设置代码段:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
单位是分钟,设置为0或负数,表示永远不会超时。
(3)在tomcat目录下/conf/web.xml中找到session-config元素,其中session-timeout元素中的30就是默认时间 ,单位是分钟。
手动调用方法设置失效时通过调用session对象的invalidate()来实现的,主要应用于用户注销场合。
lnclude指令
JSP提供了文件引用指令include。我们可以将一些重用的内容写入一个单独的文件中,然后通过include指令引用该文件,,从而解决代码冗余的问题,并且修改时也更加方便。
语法结构如下:
<%@ include file="应用文件路径"%>
include指令表示,在jsp编译时插入一个包含文本或代码文件,这个包含的过程时静态的包含的文件可以时JSP页面,HTML网页,文本文件等。
比如创建loginControl.jsp把重用代码放入其中:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String login=(String) session.getAttribute("login");
if(login==null){
response.sendRedirect("index.jsp");
return;
}
%>
有了这个独立文件,只需要在新闻发布系统的新闻发布页面中引用该文件即可。