JSP数据交互(一)

本文详细介绍了JSP的内置对象,包括request对象用于处理请求数据和解决中文乱码问题,response对象的sendRedirect方法,以及转发与重定向的区别。重点讨论了session对象在权限控制中的应用,会话的创建、维持和失效,以及include指令在代码复用上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是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>&nbsp;&nbsp;
	<a href="color.jsp?color=橙色">橙色</a>&nbsp;&nbsp;
	<a href="color.jsp?color=黄色">黄色</a>&nbsp;&nbsp;
	<a href="color.jsp?color=绿色">绿色</a>&nbsp;&nbsp;
	<a href="color.jsp?color=青色">青色</a>&nbsp;&nbsp;
	<a href="color.jsp?color=蓝色">蓝色</a>&nbsp;&nbsp;
	<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;
		}
	%>

有了这个独立文件,只需要在新闻发布系统的新闻发布页面中引用该文件即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值