0. 引言
- 学习Jsp的目的是为了解技术从前后端强耦合到前后端分离的过程,增加自己的技术积淀。了解并且体会这个过程,非常有利于后台知识的学习和后台相关技术的开发。
1. 安装Tomacat
-
官网下载Tomcat 7.0,下载到本地,然后解压即可。
-
配置环境变量:
我的电脑-属性-高级-环境变量-高级环境变量-新建-变量名:CATALINA_HOME-变量值:Tomcat路径(bin的上一个目录级)
-
验证:输入ip+端口号,出现Tomcat的页面,表示配置成功
2. Tomcat闪退
- 配置JAVA环境变量即可
3. Tomcat目录结构
Tomcat目录结构.png4. 编写第一个java web程序
- Tomcat-webapps下创建index.jsp文件
<HTML>
<head>
<title>我的第一个jsp页面</title>
</head>
<body>
<h1>欢迎大家访问我的个人主页</h1>
</body>
</HTML>
- Tomcat-webapps下创建WEB-INF文件夹
- WEB-INF文件夹下面创建名为classes和lib的文件夹和web.xml文件,web.xml内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
</web-app>
- 访问http://172.25.164.79:8080/myhome/index.jsp即可
- 如果遇到乱码:修改浏览器的编码为utf-8(Google安装Charset插件便于修改编码方式)
- 总结步骤如下:
1. 在webapps下创建项目目录
2. 编写index.jsp
3. 创建WEB-INF目录
4. 测试运行
5. WEB-INF目录结构详解
- WEB-INF是Java的Web应用的安全目录。所谓安全就是客户端无法访问,只有服务端才可以访问。
1. 在WEB-INF里面创建test.html文件
2. 访问http://172.25.164.79:8080/myhome/WEB-INF/test.html
HTTP Status 404 -
type Status report
message
description The requested resource is not available.
Apache Tomcat/7.0.85
- web.xml :项目部署文件,项目的配置信息
1. 访问:http://172.25.164.79:8080/myhome/ 会默认访问项目myhome文件夹下面的index.jsp
2. 修改index.jsp名字为abc.jsp 访问:http://172.25.164.79:8080/myhome/
HTTP Status 404 - /myhome/
type Status report
message /myhome/
description The requested resource is not available.
Apache Tomcat/7.0.85
3. 在web.xml中配置欢迎页面后,即可访问abc.jsp:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<welcome-file-list>
<welcome-file>/abc.jsp</welcome-file>
</welcome-file-list>
</web-app>
- class文件夹,用以放置.class文件
- lib文件夹,用以存放需要的jar包
6. IDEA 配置服务器并关联项目(创建了第一个jsp项目)
7. JSP简介
- JSP全名是Java Server Pages
- 其根本是一个简化的Servlet设计
- 实现了在Java当中使用HTML标签
- Jsp是一种动态网页技术标准,也是JAVAEE的标准
- JSP与Servlet一样,是在服务器端执行的。
8. JSP特点
- Java平台,安全性高,适合开发大型的,企业级的Web应用程序。
9. JSP页面元素构成
- 静态内容
- 指令
- 表达式
- 小脚本
- 声明
- 注释
10. 指令分类
-
page指令:
通常位于jsp页面的顶端,同一个页面可以有多个page指令。
-
include指令:
将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。
-
taglib指令:
使用标签库定义新的自定义标签,在JSP页面中启用定制行为。
11. page指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
1. language:制定JSP页面使用的脚本语言。默认值:java
2. import:通过该属性来引用脚本语言中使用到的类文件。默认值:无
3. contentType:用来指定JSP页面所采用的编码方式。默认值:text/html,ISO-8859-1
12. JSP注释
- JSP注释:
<%--这是title标签--%> //客户端不可见的
- HTML注释:
<!--html注释--> //客户端可见
- JSP脚本注释:
//单行注释
/*
多行注释
*/
13. JSP脚本
在JSP页面中执行的java代码
<%
out.println("我只不过想做一个好人");
%>
这句代码在idea里面不会自动提示生成,而eclispe会。
14. JSP声明
在JSP页面中定义变量和方法
<%!
String s = "张三丰"; //声明了一个字符串变量
int add(int x, int y) { //声明了一个返回整形的函数,实现两个整数的求和
return x + y;
}
%>
15. JSP表达式
在JSP表达式中可以用到声明中声明的变量和函数
你好<%=s %>
<br>
5+6 = <%=add(5, 6)%>
16. JSP的生命周期
JSP页面的声明周期.pngJSP生命周期详述.png
17. 用脚本打印九九乘法表
- 表达式
<%! String printForm99() {
String s = "";
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
s += i + "*" + j + "=" + i * j + " ";
}
s += "<br>";
}
return s;
}
%>
<%=printForm99() %>
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
18. JSP的内置对象简介
- JSP内置对象是Web容器创建的一组对象,不适用new关键字就可以使用的内置对象
19.JSP九大内置对象
- out对象
比如out对象:
<%
int[] value = {1, 2, 3};
for (int i : value) {
out.print(i);
}
%>
- request对象
- response对象
- session对象
- application对象
- Page、pageContext、exception、application对象
20. Web程序的请求响应模式
- 用户发送请求(request)
- 服务器给用户响应(response)
登录:
输入账号和密码,登录:相当于请求
服务器接收账号和密码后判断是否合法,跳转到响应页面:相当于reponse
21. 什么是缓冲区
- 缓冲区:Butter,所谓缓冲区就是内存的一块区域,用来保存临时数据。
一锅米饭一粒一粒吃——米饭一碗一碗吃——这个碗就是缓冲区
22. out对象
- out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
1. void println 向客户端打印字符串
2. void clear 清除换成从去的内容,如果在flust之后调用会抛出异常
3. void clearBuffer();清除缓冲区的内容,如果在flush之后调用不会抛出异常
4. void flush() 将缓冲区内容输出到客户端
5. int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
6. int getRemaining()返回缓冲区还剩余多少可用
7. boolean isAutoFulsh() 返回缓冲区满时,时自动清空还是抛出异常
8. void close() 关闭输出流
<%
int[] value = {1, 2, 3};
for (int i : value) {
out.print(i);
}
%>
缓冲区大小:<%=out.getBufferSize()%>byte<br>
缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
缓冲区大小:8192byte
缓冲区剩余大小:8101byte
是否自动清空缓冲区:true
<%
out.println("<h2>静夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.println("举头望明月<br>");
out.println("低头思故乡<br>");
%>
缓冲区大小:<%=out.getBufferSize()%>byte<br>
缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
静夜思
窗前明月光
疑是地上霜
举头望明月
低头思故乡
缓冲区大小:8192byte
缓冲区剩余大小:8046byte
是否自动清空缓冲区:true
<%
out.println("<h2>静夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.flush();
out.println("举头望明月<br>");
out.println("低头思故乡<br>");
%>
缓冲区大小:<%=out.getBufferSize()%>byte<br>
缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
静夜思
窗前明月光
疑是地上霜
举头望明月
低头思故乡
缓冲区大小:8192byte
缓冲区剩余大小:8142byte
是否自动清空缓冲区:true
说明:因为执行了flush,所以缓冲区变大了
<%
out.println("<h2>静夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.flush();
out.clear();
out.println("举头望明月<br>");
out.println("低头思故乡<br>");
%>
缓冲区大小:<%=out.getBufferSize()%>byte<br>
缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
静夜思
窗前明月光
疑是地上霜
说明:out.clear()不能在out.flush()之后调用否则会抛出异常,后面的代码不会执行,但是out.clearBuffer()不会抛出异常。
23. 表单提交方式get和post的区别
表单提交方式get和post的区别.png24. request对象(上)
- 客户端的请求信息被封装在request对象中,通过它我们可以获取用户输入的信息。
- request对象是HttpServletRequest类的实例。
- request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
1. String getParameter(String name):返回name指定参数的参数值(返回单个值)
2. String[] getParameterValues(String name):返回包含参数name的所有值的数组(返回集合)
3. void setAttribute(String,Object):存储此请求中的属性。
4. object getAttribute(String name):返回指定属性的属性值。
5. String getContentType():得到请求体的MIME类型
6. String getProtocol():返回请求用的协议类型和版本号
7. String getSeverName():返回接受请求的服务器主机名
- 示例:通过表单传递参数:
index.jsp文件:
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<HTML>
<head>
<title>我的个人主页</title>
</head>
<body>
<h1>用户注册</h1>
<form name="reqForm" action="request.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="favorite" value="read">读书
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="movie">电影
<input type="checkbox" name="favorite" value="internet">上网
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</HTML>
request.jsp文件:
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<HTML>
<head>
<title>我的个人主页</title>
</head>
<body>
<h1>request内置对象</h1>
用户名:
<%=request.getParameter("username")%><br>
爱好:
<%
String[] favorites = request.getParameterValues("favorite");
if (favorites != null) {
for (int i = 0; i < favorites.length; i++) {
out.println(favorites[i] + " ");
}
}
%>
</body>
</HTML>
request内置对象
用户名: ä»�å�¯å¼º
爱好: read music movie internet
获取表单数据出现中文乱码的解决办法是在体交表单的时候:
<%
request.setCharacterEncoding("utf-8");
%>
request内置对象
用户名: 付凯强
爱好: read music
- 通过URL传递参数:
<a href="request.jsp?username= lisi">测试URL传递参数</a>
用户名: lisi
<a href="request.jsp?username= 中文">测试URL传递参数</a>
用户名: ä¸æ��
但是通过request设置参数无法解决URL传递中文出现的乱码问题
但是通过配置Tomcat服务器里面conf-server.xml文件可以解决
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
25. request对象(下)
- setAttribute和getAttribute
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("password","123456");
%>
密码:<%=request.getAttribute("password")%>
密码:<%=request.getAttribute("password")%> <br>
请求的MIME类型:<%=request.getContentType()%><br>
协议类型及版本号:<%=request.getProtocol()%><br>
服务器主机名:<%=request.getServerName()%><br>
服务器端口号:<%=request.getServerPort()%><br>
请求文件的长度:<%=request.getContentLength()%><br>
请求文件的ip地址:<%=request.getRemoteAddr()%><br>
请求的真实路径:<%=request.getRealPath("request.jsp")%><br>
请求的上下文路径:<%=request.getContextPath()%><br>
request内置对象
用户名: 您好好
爱好: music movie internet 密码:123456
请求的MIME类型:application/x-www-form-urlencoded
协议类型及版本号:HTTP/1.1
服务器主机名:localhost
服务器端口号:8888
请求文件的长度:84
请求文件的ip地址:127.0.0.1
请求的真实路径:G:\javaSpace\webDemo\out\artifacts\firstweb_war_exploded\request.jsp
请求的上下文路径:/fkq
26. response对象简介
- response对象包含了响应客户请求的有关信息,但是JSP中很少直接用到它。
- 它是HttpServletResponse类的实例。
- response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。
27. response对象常用方法如下:
- String getCharacterEncoding()返回响应用的是何种字符编码
- void setContentType(String Type)设置响应的MIME类型
- PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(也称为输出流对象)(注意比较:PrintWriter与内置out对象的区别)
- sendRedirect(java.lang.String.location)重新定向客户端的请求
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
out.println("<h1>reponse对象</h1>");
out.println("<hr>");
PrintWriter outer = response.getWriter();
outer.println("大家好,我是response对象生成的输出流outer对象");
%>
PrintWriter对象总是提前于内置的out对象打印
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
out.println("<h1>reponse对象</h1>");
out.println("<hr>");
out.flush();
PrintWriter outer = response.getWriter();
outer.println("大家好,我是response对象生成的输出流outer对象");
%>
out.flush();刷新缓冲区,刷新的时候会把数据刷新到浏览器上。
<%
response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
out.println("<h1>reponse对象</h1>");
out.println("<hr>");
PrintWriter outer = response.getWriter(); //获得输出流对象
outer.println("大家好,我是response对象生成的输出流outer对象");
response.sendRedirect("index.jsp"); //请求重定向
%>
28. 请求重定向与请求转发
- 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
- 请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址蓝的URL地址不会改变。
29. session简介
- session表示客户端与服务器的一次会话
- Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭这个网页所经过的这段时间,也就是用户浏览这个网站所花费的时间
- 从上述定义中可以看到,session实际上时一个特定的时间概念
- session的中文意思就是一段时间
- 在服务器的内存中保存着不同用户的session。
30. session详细介绍
- session对象是一个JSP内置对象。
- session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
- 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
- 当一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束被成为一个会话。
- 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
- session对象是HttpSession类的实例。
31. session常用方法
- long getCreationTime():返回session创建时间
Session创建时间:<%=session.getCreationTime()%><br>
Session创建时间:1520565423914
<%!
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
Session创建时间:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session创建时间:2018年03月09日 11:17:03
- public String getId():返回session创建时JSP引擎为它设的唯一ID号
- public Object setAttribute(String name,Object value):使用指定名称将对象绑定到此会话
session.setAttribute("username","admin");
- public Object getAttribute(String name):返回此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null
从Session中获取用户名:<%=session.getAttribute("username")%>
从Session中获取用户名:admin
session_page1:
<%!
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
<%
session.setAttribute("username", "admin");
%>
Session创建时间:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session的ID编号:<%=session.getId()%><br>
从Session中获取用户名:<%=session.getAttribute("username")%>
<a href="session_page2.jsp" target="_blank">跳转到Session_page2.jsp</a>
session_page2:
<body>
<h1>session内置对象</h1>
<hr>
Session的ID编号:<%=session.getId()%><br>
从Session中获取用户名:<%=session.getAttribute("username")%>
</body>
session_page1:
Session的ID编号:866631F646E26184FB1F4FCC3AAB4AE6
session_page2:
Session的ID编号:866631F646E26184FB1F4FCC3AAB4AE6
从Session中获取用户名:admin
page1跳转到page2,id编号一致;只有关闭相关的两个页面,才表示会话结束。
- String[] getValueNames():返回一个包含此SESSION中所有可用属性的数组
<%
session.setAttribute("username", "admin");
session.setAttribute("password","123456");
session.setAttribute("age","5");
%>
Session中保存的属性有:
<%
String[] names = session.getValueNames();
for (int i = 0; i < names.length; i++) {
out.println(names[i] + " ");
}
%>
Session的ID编号:9E503181AE514CD3C56EDD9289DCE286
从Session中获取用户名:admin Session中保存的属性有: password age username
- int setMaxInactiveInterval():设置两次请求间隔多长时间此SESSION被取消(单位秒)
session.setMaxInactiveInterval(10);
32. session的生命周期
-
访问阶段: 当客户但第一次访问某个jsp或者Servlet的时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务器端会对此SessionId及进行校验。
-
会话阶段:
-
以下情况属于同一个会话:
- 某次会话当中通过超链接打开的新页面属于同一次会话。
- 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
- 除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。
-
注意事项: 注意原有会话还存在,只是这个旧的SessionId仍然存在与服务端,只不过再也没有客户端会携带它然后交予服务端校验。
-
-
销毁阶段:
Session的销毁只有三种方式:
1. 调用了session.invalidate()方法
2. Session过期(超时)
3. 服务器重新启动
33. Session对象的超时
- Tomcat默认session超时时间为30分钟。
- 设置session超时有两种方式:
- session.setMaxInactiveInterval(时间)://单位是秒
- 在web.xml配置
<session-config>
<session-timeout>
10
</session-timeout>
</session-config> //单位是分
34. application对象
- application对象实现了用户间数据的共享,可存放全局变量。
- application开始于服务器的启动,终止与服务器的关闭。
- 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
- 在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
- 服务器的启动和关闭决定了application对象的生命。
- application对象是ServletContext类的实例。
35. application对象的常用方法
- public void setAttribute(String name,Object value):使用指定名称将对象绑定到此对话。
- public Object getAttribute(String name)返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。
- Enumeration getAttributeNames() 返回所有可用属性名的枚举
- String getServerInfo() 返回JSP(SERVLET)引擎名及版本号
<%
application.setAttribute("username", "fukq");
application.setAttribute("age", "123");
application.setAttribute("sex", "男");
%>
名字是:<%=application.getAttribute("username")%>
application中的属性有:
<%
Enumeration enumeration = application.getAttributeNames();
while (enumeration.hasMoreElements()) {
out.println(enumeration.nextElement() + "  ");
}
%><br>
JSP(SERVLET)引擎名及版本号: <%=application.getServerInfo()%><br>
名字是:fukq
application中的属性有: javax.servlet.context.tempdir org.apache.catalina.resources org.apache.tomcat.util.scan.MergedWebXml org.apache.tomcat.InstanceManager sex org.apache.catalina.jsp_classpath org.apache.jasper.compiler.ELInterpreter org.apache.jasper.compiler.TldLocationsCache org.apache.tomcat.JarScanner javax.websocket.server.ServerContainer age org.apache.jasper.runtime.JspApplicationContextImpl username
JSP(SERVLET)引擎名及版本号Apache Tomcat/7.0.85
36. page对象
page对象.pngpage对象的常用方法与object对象的常用方法是基本一致的:
- 举例:
当前page页面对象的字符串描述: <%=page.toString()%>
当前page页面对象的字符串描述: org.apache.jsp.page_jsp@7c5d9ae
toString 打印的实际是对象的hashcode值
37. pageContext对象
- pageContext对象提供了对JSP页面内所有得对象及名字空间得访问。
- pageContext对象可以访问到本页所在得session,也可以取本页面所在的application的某一个属性值。
- pageContext对象相当于页面中所有功能的集大成者。
- pageContext对象的本类名也叫pageContext。
38. pageContext对象常用方法
- JspWriter getOut():返回当前客户端响应被使用的JspWriter流(out)
- HttpSession getSession():返回当前页中的HttpSession对象(session)
- Object getPage()返回当前页的Object对象(page)
- ServletRequest getRequest()返回当前页的ServletRequest对象(request)
- ServletResponse getResponse()返回当前页的ServletResponse对象(response)
- void setAttribute(String name,Object attribute)设置属性及属性值
- Object getAttribute(String name,int scope)在指定范围内取属性的值
- int getAttributeScope(String name)返回某属性的作用范围
- void forward(String relativeUrlPath)使当前页面重导到另一页面
- void include(String relativeUrlPath)在当前位置包含另一文件
session.setAttribute("username", "admin");
session.setAttribute("password", "123456");
session.setAttribute("age", "5");
用户名是:<%=pageContext.getSession().getAttribute("username")%><br>
用户名是:admin
//包含这个页面
pageContext.include("index.jsp");
//跳转到其他页面
// pageContext.forward("index.jsp");
39. Config对象
- 简介:config对象是在一个Servlet初始化时,Jsp引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServetConext对象)。
- 常用方法:
- ServletContext getServletContext 返回含有服务器相关信息的ServletContext对象
- String getInitParameter(String name)返回初始化参数的值
- Enumeration getInitParameterNames()返回Servlet初始化所需所有参数的枚举
40. exception对象
- exception对象时一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。它实际上时java.lang.Throwable的对象。
41. exception常用方法
- String getMessage()返回描述异常的消息
- String toString()返回关于异常的简短描述信息
- void printStackTrace()显示异常及其栈轨迹
- Throwable FillInStackTrace 重写异常的执行栈轨迹
errorPage="exception.jsp"
<% System.out.print(1 / 0);%>
isErrorPage="true"
异常的消息是: <%=exception.getMessage()%> <br>
异常的字符串描述是:<%=exception.toString()%><br>
42. 用户登录小栗子
- 用户名admin,密码admin,登录成功使用服务器内部转发到login_success.jsp页面,并且提示登录成功的用户名。如果登录失败则请求重定向到login_failure.jsp页面。
login.jsp页面:
<h1>登录小案例</h1>
<form action="dologin.jsp" method="post">
<p class="main">
<label>用户名: </label>
<input name="username" value=""/>
<label>密码: </label>
<input type="password" name="password" value="">
</p>
<p class="space">
<input type="submit" value="登录"/>
</p>
</form>
dologin.jsp页面
<%
String username = "";
String password = "";
request.setCharacterEncoding("utf-8"); //防止中文乱码
username = request.getParameter("username");
password = request.getParameter("password");
//如果用户和密码都等于admin,则登录成功
if ("admin".equals(username) && "admin".equals(password)) {
session.setAttribute("loginUser", username);
request.getRequestDispatcher("login_success.jsp").forward(request, response);
} else {
response.sendRedirect("login_failure.jsp");
}
%>
login_success页面
<%
String loginUser = "";
if (session.getAttribute("loginUser") != null) {
loginUser = session.getAttribute("loginUser").toString();
}
%>
login_failure页面
欢迎<%=loginUser%>登录成功!
<div>登录失败,请检查用户名或密码<br>
<a href="login.jsp">返回登录</a>
</div>
43. Javabean简介
- javabean就是符合某种特定规范的java类.
- 使用javabean可以减少代码冗余,功能区分明确,提高了代码的维护性.
44. Javabean设计原则
- 公有类
- 无参的公有构造方法
- 属性私有
- 提供geter和setter方法
45. Jsp动作元素
- 动作元素为请求处理阶段提供信息.
- 遵循XML元素的语法:有一个包含元素名的开始标签,可以有属性\可选的内容\与开始标签匹配的结束标签.
46. Jsp动作分类
- 第一类:与存取JavaBean有关的:
<jsp:useBean><jsp:setProperty><jsp:getProperty>
- 第二类:JSP1.2就开始有的基本元素,包括6个动作元素
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
- 第三类:JSP2.0新增加的元素,主要与JSP Document有关,包括6个元素
<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
- 第四类:JSP2.0新增的动作元素,主要是用来动态生成XML元素标签的值,包括3个动作
<jsp:attribute><jsp:body><jsp:element>
- 第五类:JSP2.0新增的动作元素,主要是用在Tag FIle中,有2个元素
<jsp:invoke><jsp:dobody>
47. 普通方式创建JavaBean
<%@ page import="com.test.User" %>
<%
User user = new User();
user.setmUserName("admin"); //设置用户名
user.setmPassword("123456");//设置密码
%>
账户名是: <%=user.getmUserName()%>
密码是:<%=user.getmPassword()%>
48. Jsp页面中使用jsp动作标签使用javabean
- jsp:useBeans : 在jsp页面中实例化或者在指定范围内使用javabean
<jsp:userBean id="标识符" class = "java类名" scope = "作用范围"/>
<jsp:useBean id="myUser" class="com.test.User" scope="page"></jsp:useBean>
<h1>使用javabean动作创建javabean实例</h1>
账户名是: <%=myUser.getmUserName()%>
密码是:<%=myUser.getmPassword()%>
账户名是: null 密码是:null
- jsp:setProperty:给已经实例化的javabean对象的属性赋值,一共有四种形式
<jsp:setProperty name ="javaBean实例名" property = "*"/>(跟表单关联)
<jsp:setProperty name = "javabean实例名" property = "javabean属性名"/>(跟表单关联)
<jsp:setProperty name = "javabean实例名" property = "javabean属性名" value = "beanvalue"/>(手工设置)
<jsp:setProperty name = "javabean实例名" property = "propertyName" param = "request对象中的参数名"/>(跟request参数关联)
第一种:备注:根据表单自动匹配所有的属性
<html>
<head>
<title></title>
</head>
<body>
<h1>系统登录</h1>
<hr>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value=""></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
<html>
<head>
<title>我的个人主页</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
<h1>setProperty动作元素</h1>
<hr>
<jsp:setProperty name="myUsers" property="*"></jsp:setProperty>
用户名:<%=myUsers.getUsername()%><br>
密码:<%=myUsers.getPassword()%>
</body>
</html>
用户名:fukaiqiang
密码:123456
第二种:备注:根据表单匹配部分的属性
<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
用户名:fukaiqiang
密码:null
第三种:备注:和表单无关,通过手工赋值给属性
<jsp:setProperty name="myUsers" property="username" value="Lisi"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" value="654321"></jsp:setProperty>
用户名:Lisi
密码:654321
第四种:通过Url传参数给属性赋值
<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" param="myPass"></jsp:setProperty>
用户名:<%=myUsers.getUsername()%><br>
密码:<%=myUsers.getPassword()%>
<form name="loginForm" action="dologin.jsp?myPass=789456123 " method="post">
用户名:fukaiqiang
密码:789456123
- jsp:getProperty
<!--使用传统的表达式方式来获取用户名和密码-->
用户名:<%=myUsers.getUsername()%><br>
密码:<%=myUsers.getPassword()%>
<!--使用getProperty方式来获取用户名和密码-->
用户名:<jsp:getProperty name="myUsers" property="username"></jsp:getProperty>
用户名:<jsp:getProperty name="myUsers" property="password"></jsp:getProperty>
49. Javabean四个作用域范围
- 使用usebeans的scope属性可以用来指定javabean的作用范围.
1. page:尽在当前页面有效.
2. request:可以用过HttpRequest.getAttribute()方法取得javabean对象.
3. session:可以通过HttpSession.getAttribute()方法取得javabean对象.
4.application:可以通过applicaion.getAttribute()方法取得javabean对象.
- application:
<h1>javabean的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.test.User" scope="application"/>
用户名:
<jsp:getProperty name="myUsers" property="username"/>
<br>
密码:
<jsp:getProperty name="myUsers" property="password"/>
<br>
<!--使用内置对象获取用户名和密码-->
<hr>
用户名:<%=((User) application.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((User) application.getAttribute("myUsers")).getPassword()%>
- session:
用户名:<%=((User) session.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((User) session.getAttribute("myUsers")).getPassword()%>
- request:
<jsp:useBean id="myUsers" class="com.test.User" scope="request"/>
<%
request.getRequestDispatcher("testscope.jsp").forward(request,response);
%>
用户名:<%=((User) request.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((User) request.getAttribute("myUsers")).getPassword()%>
- page:
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
<%
String username = "";
String password = "";
if (pageContext.getAttribute("myUsers") != null) {
username = ((User) pageContext.getAttribute("myUsers")).getUsername();
password = ((User) pageContext.getAttribute("myUsers")).getPassword();
}
%>
用户名:<%=username%>
密码:<%=password%>
50. Model1简介
- Model1模型出现前,整个Web应用的情况:几乎全部由Jsp页面组成,Jsp页面接受处理客户端的请求,对请求处理后直接做出响应.
- 弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可扩展性和可维护性非常差.
- Javabean的出现可以使jsp页面中使用javabean封装的数据或者调用javabean的业务逻辑代码,这样大大提升了程序的可维护性.
-
Model1模型:Jsp:页面;JavaBean:逻辑;javabean:数据:
Model1简介.png
51. jsp+javabean完成用户登录功能
login:
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value=""></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"></td>
<td></td>
</tr>
</table>
</form>
dologin:
<jsp:useBean id="loginUser" class="com.test.User" scope="page"/>
<jsp:useBean id="userdao" class="com.test.UserDao" scope="page"/>
<jsp:setProperty name="loginUser" property="*"/>
<%
//如果用户和密码都等于admin,则登录成功
if (UserDao.userLogin(loginUser)) {
session.setAttribute("loginUser", loginUser.getUsername());
request.getRequestDispatcher("login_success.jsp").forward(request, response);
} else {
response.sendRedirect("login_failure.jsp");
}
%>
<html>
<head>
<title>Title</title>
</head>
<body>
我是登录失败页面
</body>
</html>
<html>
<head>
<title>Title</title>
</head>
<body>
我是成功登录页面
</body>
</html>
52. http协议的无状态性
- 无状态是指:当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它是刚才那个浏览器.简单地说:就是服务器不会去记得你,所以就是无状态协议.
53. Cookie概述
- 保存用户的状态的两大机制
- Session
- Cookie
- Cookie是web服务器保存在客户端的一些列文本信息.
- 典型应用一:判定注册用户是否已经登录网站.
- 典型应用二:"购物车"的处理.
54. Cookie的作用
- 对特定对象的追踪.
- 保存用户网页浏览记录与习惯
- 简化登录
55. Jsp页面中创建与使用Cookie
- 创建Cookie对象
Cookie newCookie = new Cookie(String key,Object value);
- 写入Cookie对象
response.addCookie(new Cookie);
- 读取Cookie对象
Cookie[] cookies = request.getCookies();
- 与Cookie有关的常用方法
1. void setMaxAge(int expiry):设置cookie的有效期,以秒为单位.
2. void setValue(String value):在cookie创建后,对cookie进行赋值.
3. String getName():获取cookie的名称.
4. String getValue():获取cookie的值.
5. int getMaxAge():获取cookie的有效时间,以秒为单位.
56. Cookie在登录中的应用
- 实现记忆用户名和密码功能
login.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals("username")) {
username = URLDecoder.decode(c.getValue(), "utf-8");
}
if (c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="<%=username%>"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="<%=password%>"/></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"/><input type="reset" value="取消"/></td>
</tr>
</table>
</form>
dologin.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
//首先判断用户是否选择了记住登录状态
String[] isUseCookies = request.getParameterValues("isUseCookie");
if (isUseCookies != null && isUseCookies.length > 0) {
//把用户名和密码保存在Cookie对象里面
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
//使用URLEncoder解决无法在Cookie当中保存中文字符串问题
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);//设置最大生存期限为10天
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
} else {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals("username") || c.getName().equals("password")) {
c.setMaxAge(0); //设置Cookie失效
response.addCookie(c); //重新保存。
}
}
}
}
%>
<a href="user.jsp" target="_blank">查看用户信息</a>
</body>
user.jsp
<body>
<h1>用户信息</h1>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password = "";
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0) {
for(Cookie c:cookies) {
if(c.getName().equals("username")) {
username = URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<br>
用户名:<%=username %><br>
密码:<%=password %><br>
</body>
解决Cookie中文乱码的问题:
1. request.setCharacterEncoding("utf-8");
2. URLEncoder 编码
3. URLDecoder 解码
57. Session与Cookie的对比
- session
- 在服务器端保存用户信息
- session中保存的是Object类
- 随会话的结束而将其存储的数据销毁
- 保存重要的信息
- 保存对象的大小没有限制
- cookie
- 在客户端保存用户信息
- cookie保存的是String类型
- cookie可以长期保存在客户端
- 保存不重要的用户信息
- 保存对象的大小有限制
58. include指令
<%@ include file = "URL"%>
<%@ include file = "date.jsp"%>
59. include动作
<jsp:include page = "URL" flush = "true|false"/>
page:要包含的页面
flush:被包含的页面是否从缓冲区读取
60. include指令与include动作的区别
指令与动作.png61. forward动作
<jsp:forward page="user.jsp"></jsp:forward>
相当于转发:
request.getRequestDispatcher("user.jsp").forward(request,response);
62. param动作
jsp:param :用于增加一个参数
<jsp:forward page="user.jsp">
<jsp:param name="email" value="123@163.com"></jsp:param>
</jsp:forward>
jsp:param :用于修改一个参数的参数值
<jsp:forward page="user.jsp">
<jsp:param name="password" value="88888"></jsp:param>
</jsp:forward>
63. 支持
希望阅读本篇能够让你对Jsp有更全面的理解,还请多多支持,多多关注,多多点赞,多多收藏.
网友评论