第五章 走进JSP

ps:文章内容主要记录我学习在老师指示之下的重点内容,内容不全还多见谅

了解JSP的基本构成

JSP页面主要由标签指令、HTML语句、注释、嵌入Java代码、JSP动态标签等5部分构成。

由下图代码进行具体解释

(1)指令标签

上述代码第一、二行就是JSP指令标签,通常位于文件的首位

(2)HTML语句

3~9行、17~18行就是HTML的代码,这些代码定义了网页内容的显示格式

(3)注释

10行是注释代码,在JSP文件中可以使用JSP注释格式和嵌入java代码的注释格式

(4)嵌入的java代码

在JSP中可以嵌入java的代码,这些代码包含在<%%>标签之中,例如上述代码12~14行就是嵌入的java程序代码。

(5)JSP动作标签

上述代码中没有JSP的动作标签,JSP动作标签是JSP标签的一种,都是由“JSP”开头,eg:“<jsp:forward>”标签可以将用户的请求转发给另一个JSP页面或Servlet处理。

指令标签(page和include指令)

5.3.1page指令

1.language属性

该属性用于设置JSP页面的使用的语言,目前只支持Java语言。eg:

<%@ page language="java"%>

2.extend属性

该属性用于设置JSP页面继承的Java类,所有JSP页面在执行之前都会被服务器解析成Servlet,而Servlet是由java定义的,所以JSP和Servlet都可以继承指定的父类。(但是该属性不常用)

3.import属性

该属性设置JSP导入的类包,JSP可以嵌入java代码,这些java代码在调用api时,需要导入相应的类包。

<%@page import="java.util.*"%>

4.pageEncoding属性

该属性用于定义JSP页面的编码格式,也就是指定文件编码,如果该属性值为ISO-8859-1,则该JSP页面不支持中文字符,通常设置为GBK/UTF-8

<%@page pageEncoding="UTF-8"%>

5.contentType属性

该属性用于定义JSP页面的MIME类型和字符编码,浏览器会据此显示网页内容。

<%@page contentType="text/html;charset=“UTF-8”"%>

要与pageEncoding属性值相对应。

5.3.2include指令

include指令用于文件包含。该指令包含另一个文件内容,但是其仅支持静态包含,即被包含的文件中所有的内容都将原样包含到该JSP页面中;其中如果有代码将不被执行。包含的对象可以时java代码,HTML代码或者另一个JSP页面。

eg:

<%@include file="jsp.jsp"%>

上述代码将当前JSP文件中相同位置的jsp.jsp文件包含进来,其中,file属性用于指定被包含的文件,其值是当前JSP页面文件的相对URL路径(相对路径和绝对路径自行了解)

(15条消息) 绝对路径和相对路径详解_心所向皆可成的博客-CSDN博客https://blog.csdn.net/hgd613/article/details/8041662?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167902683616800184124119%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167902683616800184124119&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-8041662-null-null.142%5Ev74%5Ewechat_v2,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84&spm=1018.2226.3001.4187下面举例演示include指令的引用,在当前JSP页面中包含date.jsp文件,该文件定义获取当前日期的java代码,从而组成了当前页面显示日期的功能。

eg5-2在当前页面中包含另一个JSp文件类显示当前日期

(1)首先编辑date.jsp文件,程序代码如下:

 (2)编辑index.jsp文件,它是本实例的首页文件,其中使用到了include指令包含date.jsp文件到当前页面,被包含的date.jsp文件中的java代码先以静态方法导入index.jsp文件中,然后在被服务器编译执行。具体代码如下: 

<%@ page language="java" import="java.util.*" 
	contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>include指令演示</title>
</head>
<body>
<!-- HTML注释信息 -->
当前的日期是:<%@include file="date.jsp" %>
<br>
</body>
</html>

运行结果如下:

 ps:包含文件与被包含文件的pageEncoding属性值要一致。

5.3.3taglib指令(略)

5.4嵌入java代码

5.4.1代码片段

代码片段就是在JSP页面中嵌入Java代码,也可以称为脚本段或脚本代码。代码在页面被请求期间被执行,可以通过JSP内置对象在页面输出内容,访问session会话,编写流程控制语句等,具体格式如下:

<%编写Java代码%>

Java代码片段被包含在<%和%>之间,可以编写单行或多行的java代码,语句也;结尾,编写格式与java相同。

eg:

<%
Date now=new Date();
String dateStr;
dateStr=String.format("%tY年%tm月%td日",now,now,now);
%>

上述代码是在代码片段中创建now对象,并且生成格式化的日期字符串。

eg5_3在代码片段中编写九九乘法表。具体代码如下:

图中标记的语句是创建JSP文件时自带的语句,不知道为什么有这句语句就运行不了,删除之后就可以成功运行。运行结果如下:

 代码中的编码格式记得改为UTF-8

ps:代码对于格式要求很高特别是在page指令中空格的差错都会导致运行失败,并且文件运行时要先保存后运行,不然就不会运行出当前未保存的结果。

5.4.4声明

声明脚本用于JSP页面中定义全局的(即整个JSP页面都可以引用)成员的变量或者方法,他们可以被整个JSP页面访问,服务器执行时会将JSP页面转换为Servlet类,在该类中会把使用JSP声明脚本定义的变量和方法定义的类成员。

(1)全局变量的定义、

eg:

<%! long startTime=System.nanoTime();%>

上述代码在JSP页面中定义了全局变量startTIme,该全局变量可以在整个JSp页面使用。

(2)定义定义全局方法

eg:

<%!

        int getMax(int a;int b){

                        int max=a>b?a:b;

                        return max;                           

}

%>

5.4.3JSP表达式

JSP表达式可以直接把java的表达式结果输出到JSP页面中。表达式最终运算结果将会被转换为字符串类型。JSP表达式的语法结构如下:

<%=表达式>

其中表达式的可以是任何Java语句的完整表达。

eg:圆周率是:

<%=Math.PI%>

5.5注释(略)

5.6Request对象

request对象是Javax.servlet.http.HttpServletRequest类型的对象,该对象代表了客户的请求信息,主要用于接收HTTP传送到服务器端的数据(包括头信息,系统信息,请求方式以及请求参数)。request对象的作用域为一次请求。

5.6.1获取请求参数值

在一个请求中,可以通过使用”?“的方式来传递参数,然后通过request对象的getParameter()方法来获取参数值。eg:

String id = request.getParameter("id");

上述代码中使用getParameter()方法从request对象中获取参数id的值,如果request对象中不存在次参数,则返回null。

eg5_4使用request对象获取请求参数值

首先在Web项目中创建eg5_4index.jsp页面,在其中加入一个超链接按钮请求show.jsp页面,并且在请求后加入一个参数id

 然后新建一个show.jsp页面,通过getParameter()获取id和name的参数值,并将其输入在页面中。代码如下:

 运行结果为:

很奇怪id和name两个参数值都为null,目前没有找到问题所在。

5.6.2获取Form表单信息

在一个表单中会有不同的标签元素,对于文本元素、单选按钮、单选下拉列表而言,都可以使用getParameter()方法来获取其具体的值,但对于复选框以及多选框列表而言,就要使用getParameterValues()方法来获取,该方法会返回一个字符串数组,通过循环遍历这个数组内容就可以获得用户所选的所有内容。

eg5_5获取Form表单信息

首先创建eg5_5index.jsp文件,在该页面中创建一个form表单,在表单中分别加入文本框(input中text类型)、下拉列表框(select标签加option标签)、单选按钮(input标签中type=”radio“类型)、复选框(input标签中type=”checkbox“)

 运行结果如下:

 接下来编写eg5_5show.jsp(遍历数组是一定不能取数组长度的编号,否则会越界)

 在eg5_5index.jsp文件运行完成后需要提交信息后,eg5_5show.jsp才能运行,具体结果如下:

5.6.3获取请求客户端信息

具体方法由代码进行具体说明,代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>获取请求信息</title>
	</head>
	<body>
	<ul style="line-height:24px">
	<li>客户使用的协议:<%=request.getProtocol() %></li>
	<li>客户端发送请求的方法:<%=request.getMethod() %></li>
	<li>客户端请求的路径:<%=request.getContextPath() %></li>
	<li>客户机IP地址:<%=request.getRemoteAddr() %></li>
	<li>客户机名称:<%=request.getRemoteHost() %></li>
	<li>客户机请求端口号:<%=request.getRemotePort() %></li>
	<li>接受客户信息页面:<%=request.getServletPath() %></li>
	<li>获取报头中User-Agent值:<%=request.getHeader("User-Agent") %></li>
	<li>获取报头中accept值:<%=request.getHeader("accpet") %></li>
	<li>获取报头中Host值<%=request.getHeader("Host") %>:</li>
	<li>获取URI:<%=request.getRequestURI() %></li>
	<li>获取URL:<%=request.getRequestURL() %></li>
	</ul>
	</body>
</html>

运行结果如下:

 5.6.4在作用域中管理属性

通过setAttribute()方法可以在request对象的属性列中添加一个属性,然后再request对象的作用域范围内通过getAttribute()方法将其属性值取出,此外可以通过removeAttribute()方法将一个属性删掉。

eg:管理request对象属性

首先将date属性加入request属性列表中,然后输出这个属性的值;接下来用removeAttribute()方法将date属性值删除,再次输出date属性值。

具体代码如下:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>管理request对象属性</title>
	</head>
	<body>
	<%
	request.setAttribute("date",new Date());
	
	%>
	<ul style="linr-height:24px">
	<li>获取date属性值:<%=request.getAttribute("date") %></li>
	<!--将属性值删除 -->
	<%request.removeAttribute("date"); %>
	<li>获取删除后date属性值:<%=request.getAttribute("date") %></li>
	</ul>
	</body>
</html>

代码运行结果如下:

 5.6.5 cookie管理

cookie是小段的文本信息,通过cookie可以识别用户身份、记录用户名及密码、跟踪重复用户。cookie在服务端生成并发送给浏览器,浏览器将cookie的key/value保存到某个指定的目录中,服务器的名称与值可以由服务端定义。

通过cookie的getCookie()方法可以获取所有cookie对象的集合,然后通过cookie对象的getName()方法获取指定名称的cookie,再通过getValue()方法即可获得cookie对象的值。另外,将一个cookie对象发送到客户端使用了request对象的addCookie()方法。

eg5_8管理cookie

首先创建eg5_8index.jsp页面文件,在其中创建form表单,用于输入用户信息;并且从request对象中获取cookie,判断是否含有此服务器发送过的cookie。如果没有,则说明该用户第一访问本站;如果由则直接将值读出来,并赋值给对应的表单。代码如下;

<%@ 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 welcome ="第一次访问";
	String [] info =new String[]{"","",""};
	Cookie[] cook = request.getCookies();
	if (cook!=null){
		for(int i=0;i<cook.length;i++){
			if(cook[i].getName.equals("mrCookInfo")){
				info=cook[i].getValue.split("#");
				welcome="欢迎回来";
			}
		}
	}
	%>
	<%=info[0]+welcome%>
	<form action="eg5_8show.jsp"method="post">
	<ul style="line-height:23">
	<li>姓&nbsp;&nbsp;&nbsp;名:<input name="name"type="text"value="<%=info[0]%>"></li>
	<li>出生日期:<input name="birthday"type="text"value="<%=info[1]%>">
	<li>邮箱地址:<input name="mail"type="text"value=<%=info[2] %>>
	<li><input type="submit"value="提交">
	</ul>
	</form>
	</body>
</html>

接下来创建eg5_8show.jsp页面文件,在该页面中通过request对象将用户输入的表单信息提取出来;创建一个cookie对象,并且通过response对象的addCookie()方法将其发送到客户端。具体代码如下:

<%@ 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("name");
	String birthday = request.getParameter("birthday");
	String mail = request.getParameter("mail");
	Cookie myCook = new Cookie("mrCookInfo",name+"#"+birthday+"#"+mail);
	myCook.setMaxAge(60*60*24*365);//设置cookie有效期
	response.addCookie(myCook);
	%>
	表单提交成功
	<ul style="line-height:24px">
	<li>姓名<%=name%>
	<li>出生日期<%= birthday%>
	<li>电子邮箱<%= mail%>
	<li><a href="eg5_8index.jsp">返回</a>
	</ul>
	</body>
</html>

代码eg5_8index.jsp运行结果如下;

注意在本代码中姓名不可以填写为中文(我暂时也不清楚原因,否则会报错) 

代码eg5_8show.jsp运行结果如下:

点击提交或者返回可以实现在两个页面之间的跳转。

5.7response对象

response代表的是对客户端的响应,主要将JSP容器处理过的对象传回给客户端。response对象也具有作用域,它只在JSP页面内有效。(老师建议了解重定向网页即可)

5.7.1重定向网页

重定向是通过使用sendRedirect()方法,将响应发送到另一个指定的位置进行处理。重定向可以将地址重新定向到不同的主机上,在客户端浏览器上将会得到跳转的地址,并重新发送请求链接,用户可以从浏览器的地址栏中看到跳转后的地址,进行重定向操作,request中的属性全部失效,并且进入一个新的request对象作用域。

eg,使用重定向方法重定向到明日图书网

response.sendRedirect("www.mingribook.com")

5.8session对象

session对象是由服务器自动创建的与客户请求相关的对象。服务器为每个用户都生成一个session,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的类型为key/value。session对象的value值可以是复杂的对象类型,而且不仅仅局限于字符串类型。session对象中常用的方法:

session对象常用方法
方法返回值说明
getAttribute(String name)Object获得指定名字的属性
getAttributeNames()Enumeration获取session中所有属性对象
getCreationTime()long获取session对象创建时间
getId()String获得session对象唯一编号

5.8.1 创建及获取session信息

session始于请求有关的对象,是java.servlet.http.HttpSession对象,用于保存和存储页面的请求信息。session对象的setAttribute()方法可实现将信息保存在session范围内,而通过getAttribute()方法可获取保存在session范围内的信息:

setAttribute()方法的语法格式如下:

setAttribute(String key,Object obj)

①key:保存在session范围内的关键字

②obj:保存在session范围内的对象

getAttribute()方法语法格式如下:

getAttribute(String key)

key:指定保存在session范围内的关键字。

eg5_9创建和获取session信息

(1)在eg5_9index.jsp页面中,实现将文字信息保存在session范围内。具体代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>将文字信息保存到session范围内</title>
	</head>
	<%
	String sessionMessage="session练习";
	session.setAttribute("message",sessionMessage);
	out.print("保存到session范围内的对象为:"+sessionMessage);
	%>
	<body>
	</body>
</html>

运行结果为:

 (2)在eg5_9default.jsp页面中,获取保存在session范围内的信息,并在页面中显示。具体代码如下:

<%@ 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 message=(String)session.getAttribute("message");
	out.print("保存在session范围内的值为:"+message);
	%>
	</body>
</html>

运行结果为:

 ps:需要先运行eg5_9index.jsp后再运行eg5_9default.jsp才能获取到session范围内的值。

5.8.5 session对象的应用

session是较常用的内置对象之一,与request对象相比其作用范围更大。

eg5_10 在eg5_10index.jsp页面中,提供用户输入用户名文本框;在eg5_10session.jsp页面中,将用户输入的用户名保存在session对象中,用户在该页面可以添加喜欢去的地方;在eg5_10result.jsp页面中,将用户输入的用户名与最想去的地方在页面中显示出来。

(1)eg5_10index.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>
	<form id="form1"name="form1"method="post"action="eg5_10session.jsp">
	<div align="center">
	<table width="23%0boeder="0">
	<tr>
	<td width="36%"><div align="center">您的名字是:</div></td>
	<td width="64%">
	<label>
	<div align="center">
	<input type="text" name="name"/>
	</div>
	</label>
	</td>
	</tr>
	<tr>
	<td colspan="2">
	<label>
	<div align="center">
	<input type="submit"name="Submit"value="提交"/>
	</div>
	</label>
	</td>
	</tr>
	</table>
	</div>
	</form>
	</body>
</html>

eg5_10session.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");//对request编码格式进行规定
	String name=request.getParameter("name");//获取用户填写的用户名
	session.setAttribute("name",name);//将用户名保存在session对象中
	%>
	<div align="center">
	<form action="eg5_10result.jsp"id="form1"name="form1"method="post">
	<table width="28%"border="0">
	<tr>
	<td>您的名字是:</td>
	<td><%=name %></td>
	</tr>
	<tr>
	<td>你最喜欢去的地方是:</td>
	<td><label><input type="text"name="place"/>
	</label>
	</td>
	</tr>
	<tr>
	<td colspan="2"><label>
	<div align="center">
	<input type="submit"name="Submit"value="提交"/>
	</div>
	</label>
	</td>
	</tr>
	</table>
	</form>
	</body>
</html>

eg5_10result.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>
	<%
	// 获取保存在session范围内的对象
	request.setCharacterEncoding("UTF-8");//对request编码格式进行规定
	String name =(String)session.getAttribute("name");
	String place=request.getParameter("place");
	session.setAttribute("place", place);
	%>
	<form action=""name="form1"id="form1"method="post">
	<table width="28%"border="0">
	<tr>
	<td colspan="2"><div align="center"><strong>显示答案</strong></div>	
	</td>
	</tr>
	<tr>
	<td width="49%"><div align="left">您的名字是:</div></td>
	<td width="51%"><label>
	<div align="left"><%=name %>
	</div>
	</label>
	</td>
	</tr>
	<tr>
	<td><label>
	<div align="left">您最喜欢去的地方是:
	</div>
	</label>
	</td>
	<!-- 将用户最喜欢去的地方在页面中显示 -->
	<td><div align="left"><%=place %></div>
	</td>
	</tr>
	</table>
	
	
	</form>
	</body>
</html>

具体运行结果如下:

 

 

 注意在调用属性为中文时,要对request的编码格式进行规定request.setCharacterEncoding("UTF-8");语句即可完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值