在第三周的学习中,只对重点内容5.4、5.6进行了学习,虽然仿照书中代码的格式顺利完成了第三周的作业,但对jsp的许多方面一知半解,这一次对课本中jsp这一章进行了整体的学习,逐渐建立起了一个对jsp的认知框架。
何为JSP?
(1)jsp是一种动态网页技术标准;
(2)jsp代码由html代码、java代码、jsp标签构成;
(3)JSP、HTML以及编译运行它们的web服务器共同构成了服务器,在通过HTTP协议接收到用户来自web客户端的请求后处理java代码片段,通过HTML页面返回给web客户端,最终在客户端的浏览器上以特定的效果呈现java代码的结果,这就是jsp的工作原理;
(4)JSP的特点:
(5)JSP的基本构成:
include指令测试:
书中是这样描述include指令的:该指令可以在jsp页面(具体来说,是jsp文件/代码)中包含另一个文件的内容,但它仅支持静态包含(测试了动态注释,也可行),也就是说被包含文件中的所有内容(并不是所有内容)都被原样包含到该jsp页面中,如果被包含的文件中有代码,将不被执行。被包含的文件可以是一段JAVA代码,HTML代码,或者是另一个jsp界面(套娃了)。
对课本中说得模糊和不准确的地方用“()“进行了注释,同时在上面的思维导图中总结了我对include标签的理解。
test.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Date"%>
<title>include指令演示</title>
<h1>这是为了研究测试include指令的用途和效果</h1>
你好!
<%
int n=100;
int sum=0;
for(int i=1;i<=n;i++){
sum+=i;
}
%>
<%=sum%>
<%
Date now=new Date();
String dateStr;
dateStr =String.format("%tY年%tm月%td日",now,now,now);
%>
<!-- <% int m;%> -->
includet.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Date"%>
<title>include指令演示</title>
<h1>这是为了研究测试include指令的用途和效果</h1>
你好!
<%
int n=100;
int sum=0;
for(int i=1;i<=n;i++){
sum+=i;
}
%>
<%=sum%>
<%
Date now=new Date();
String dateStr;
dateStr =String.format("%tY年%tm月%td日",now,now,now);
%>
<!-- <% int m;%> -->
运行效果:
关于jsp的注释问题
课本中,对JSP的分成五个部分:指令标签、HTML语句、注释、Java代码片段、JSP动作标签。而我个人总结成四个部分:令标签、HTML语句、注释、JSP动作标签。我将注释和Java代码片段合并了。
首先,我解释一下我对注释的理解。注释,写下批注,用以解释。正如文言文的注释,对字的注释是解释这个字今天的意思,对句的解释是这句话翻译成白话怎么说。
接着,我呈现一下书中JSP的注释:
啊这,有点尴尬,原来是我上次写作业看错了,JSP注释是<%-- --%>,而Java代码是在<% %>里,我开始以为两个都是后面的格式,想将这两个部分合并。。。
jsp注释没有问题。
jsp表达式:
JSP表达式的功能是将Java代码中表达式最终的值嵌入到直接嵌入到HTML代码中,使用Java的System.out.println方法并不会在网页上显示输出的结果,查看源码也看到。
<%int n=100;%>
<%=n %> <!-- 成功输出,浏览器上显示n的最终值 -->
<%
int wa=1000;
System.out.println(wa);
%> <!-- 输出失败,浏览器不显示,源码不显示 -->
request对象:
(1)request对象,简单来说,就是用于获取在Java代码片段中设置的各种参数的值。
(2)cooike管理:主要用于浏览器自动填表单和用户自动登录
首先,创建一个cookieshow.jsp文件,为后续使用cookie来管理表单做一个铺垫:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>cookie show页面</title>
</head>
<body>
<%
//实例化三个String对象,名字分别为name、birthday、mail,它们分别存储Name、Birthday、Mail的值
String name=request.getParameter("Name");
String birthday=request.getParameter("Birthday");
String mail=request.getParameter("Mail");
//实例化Coookied对象,名称为mycook,名字是me,值包括name、birthday、mail,他们用#分隔开
Cookie myCook=new Cookie("me",name+"#"+birthday+"#"+mail);
//设置cookie的有效期
myCook.setMaxAge(60*60*24*365);
//将一个cookie对象myCook发送到客户端
response.addCookie(myCook);
%>
表单提交成功<br>
<!-- 利用jsp表达式输出Java参数的值 -->
姓名:<%=name %><br>
出生日期:<%=birthday %><br>
邮箱地址:<%=mail %><br>
<a href="index1.jsp">返回</a>
</body>
</html>
接着,创建一个index1.jsp文件调用cookieshow.jsp中创建的cookie对象,实现浏览器自动填写表单:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index1</title>
</head>
<body>
<%
String welcome="首次访问";
//课本中将这里的初值都设置”“,使得表单在一开始时就是空的,如果不设初值,表单一开始会显示null,即String对象的默认值
String[] info=new String[]{"","",""};
//使用request的getCookies的方法,获得所有Cookie对象的集合,存储在Cookie数组cook中
Cookie[] cook=request.getCookies();
//第一次进入这个界面cook数组是空的,不会执行if语句里的内容
if(cook!=null){
for(int i=0;i<cook.length;i++){
if(cook[i].getName().equals("me")){
info=cook[i].getValue().split("#");
welcome=",欢迎回来!";
}
}
}
%>
<!-- JSP表达式中的Java表达式中的内容与system.out.println括号中的内容格式是一致的 -->
<%=info[0]+welcome %>
<form action="cookieshow.jsp" method="post">
<!-- value的值都是info数组中存储的内容,那么在另一个页面中使用getParameter获取各项的值 最终获取的其实时info中的内容-->
姓名:<input name="Name" type="text" value="<%=info[0]%>">
出生日期:<input name="Birthday" type="text" value="<%=info[1]%>">
邮箱地址:<input name="Mail" type="text" value="<%=info[2]%>">
<input type="submit" value="提交">
</form>
</body>
</html>
(3)遇到的问题:
主要遇到了两个问题:开始时我看到只对cookieshw中,cookie类只实例化了一次,即只有一个对象,但在index1中确创建了一个数组,我以为可以不用for循环去遍历cook数组也可以实现类似书中的效果,但这个想法有点问题,因为我不使用for循环,cookie似乎无法为我记录我上一次输入的内容。后来将代码一行行重新打,一行行运行,花费了很久才发现和解决了这个问题,至于原理,还没有想明白。
最初我是这样的,每次cookieshow返回后表单中没有我上一次输入的内容
修改成下面这样后,正常了
正常运行效果:
5.session对象:
完成第三次作业主要使用的是session
实现如上效果的思路:
(1)写一个index.jsp文件,提供账号和密码的文本输入框以及登录按钮,登陆其实是”submit“,点击后跳转到Session.jsp;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index.jsp</title>
</head>
<body>
<form action="Session.jsp" method="post">
账号:<input type="text" name="info1" > <br>
密码:<input type="text" name="info2" > <br>
<input type="submit" value="登录">
</form>
</body>
</html>
(2)写一个Session文件,将第一个页面中的账号和密码的“value”通过request对象的getParameter和session对象的setAttribute方法,保存到session对象中,之后通过session的getAttribute来获取账号和密码的值,并在if-esle语句中与预设的账号密码对照,视情况输出正常访问和账号密码错误的提示;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session.jsp</title>
</head>
<body>
<%
String account=request.getParameter("info1"); //使用request的getParameter方法获取info1的值,存入account
String passward=request.getParameter("info2"); //使用request的getParameter方法获取info1的值,存入passward
session.setAttribute("AC", account); //使用session的setAttribute方法,将accout存储的内容存到session对象中,并命名为AC
session.setAttribute("PA", passward);//同理
String session_account=(String)session.getAttribute("AC"); //获取session对象之中名称为AC的内存区所对应的内容,强转成字符串
String session_passward=(String)session.getAttribute("PA");//获取session对象之中名称为PA的内存区所对应的内容,强转成字符串
if(session_account.equals("chunfeng")&&session_passward.equals("123456")){ //比较两个字符串的内容要调用equal方法
out.print("你好,"+session_account+"!");
}
else{
out.print("你输入的账号密码有误,请重新输入!");
}
%>
<form action="Session.jsp" method="post">
账号:<input type="text" name="info1" > <br>
密码:<input type="text" name="info2" > <br>
<input type="submit" value="登录">
</form>
<a href="test.jsp">进入下一个界面进行权限测试</a>
</body>
</html>
(3)写一个test.jsp文件,观察账号和密码在session对象中的存储情况
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String session_account=(String)session.getAttribute("AC");
String session_passward=(String)session.getAttribute("PA");
if(session_account.equals("chunfeng")&&session_passward.equals("123456")){
out.println("欢迎您,"+session_account);
}
else{
out.println("欢迎您,"+session_account);
%>
<br>
<%
out.println("非正常访问");
}
%>
</body>
</html>
运行效果图:
注意,三个界面只能依次打开,否则会出现状态500报错
6.本次学习中对一些名词的简单了解:
(1)HTTP:Hyper Text Transfer Protocol,HTTP,超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当;
(2)API:Application Programming Interface,API,应用程序接口,是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性;
(3)URL:uniform resource locator,URL,统一资源定位系统,是因特网的万维网服务程序上用于指定信息位置的表示方法。
7.注意/总结/思考:
(1)在Java片段中不能直接使用import导入包(会使整个网页状态500报错),只能使用page的属性来设置包;
(2)Java注释、jsp标签在查看网页源码时都不会显示,也就是说查看源码显示的时纯html内容;
(3)使用include指令引用另一个jsp文件时,如果不要求被引用的jsp文件正常单独打开运行,可以不必使用page指令为这个被引用的界面定义属性。因为在测试过程中,我发现仅在被引用的文件里放入Date包,引用和被引用文件都可以正常打开,而仅在引用被引用文件的文件中导入Date包时,仅有被导入Date包的文件正常打开显示效果了;
(4)下一次写代码,实现某种效果时还是写出一个小功能/效果块就像运行一次,如果出现错误就立即修改,不然像这次cookie一股脑写完所有代码之后不能正常运行,又很难找到是哪里错了而浪费好多时间;
(5)对JSP代码结构的抽象理解: