一、JSP简介
Java Server Page服务端页面
1.概念
一种既可以定义HTML,CSS,JS,又可以定义Java代码的页面。
功能:用来简化页面的书写
2.原理
本质:就是一个Servlet。
当浏览器请求jsp页面时,服务器会查找是否存在。如果存在服务器,内置的JSP转换引擎会将.jsp转换成.java。然后调用javac编译成.class文件,然后使用。
3.jsp脚本:用来标识Java代码
1.注释脚本
<%-- --%>注释脚本(这是jsp页面上的注释)
标记语言注释<!-- -->
缺点:会发送到客户端,不能注释Java代码
jsp注释<%-- --%>
优点:不会发送到客户端,能注释Java代码
2.生成的Java代码在成员位置
<%!
int a=100;
%>
3.生成的Java代码在service()方法中
<%
int b=200;
%>
4.生成的Java代码在print(“abc”)里面,在页面上写东西
<%="abc"%>
二、响应头—refresh定时刷新
- 响应头的格式
refresh:秒数;url=跳转的页面
- 设置相应头
response.setHeader(String key,String value);设置字符串形式的响应头
response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
- 设置定时刷新
//响应一个刷新头refresh 值:"3;url=/login.jsp"
response.setHeader("refresh","3;url=/login.jsp");
相应的案例:登录失败时,提示“用户名与密码不匹配”,3秒后自动跳转到登录页面。
三、会话技术
1.Web中的会话:指的就是,浏览器跟服务器建立一次的通信,这次通信中,可以包含多次请求和响应,并且可以在这个多次请求和响应间进行数据的共享。
2.会话技术:解决客户端和服务端数据的共享问题;
HTTP是一种无状态协议,所以我们要通过会话技术,来解决多次请求时数据的共享。
- 客户端会话技术Cookie:将数据保存在客户端(浏览器)(能够减轻服务端的压力,但是数据不安全)
- 服务端会话技术Session:将数据保存在服务端(数据有安全保证,但是会增加服务器的压力)
1.客户端会话技术Cookie
原理:客户端请求一个资源,服务器做出响应时,会发送set-cookie头,共享数据;客户端接收到响应,会将数据保存在客户端浏览器中;客户端再一次请求服务器时,会通过cookie头携带该数据;服务端接收到请求,会来解析获取数据。
//1.创建cookie
Cookie cookie = new Cookie("name","zhangsan");
//2.响应cookie
response.addCookie(cookie);
//3.当浏览器二次请求时,取出
Cookie[] cookies = request.getCookies();
//遍历cookies
if(cookies!=null){
for (Cookie cookie : cookies) {
//获取Cookie的名字来判断
String name = cookie.getName();
if(name.equals("name")){
String value = cookie.getValue();
System.out.println(value);
}
}
}
//4.消除Cookie 把存活时间设置为0
cookie.setMaxAge(60*60*24*7);
Cookie应该注意的几个问题
- 1.持久化问题
默认情况下,cookie中的数据是保存在浏览器的内存中。浏览器一关闭,内存一释放,Cookie中的数据就没了。
//设置Cookie的保存时间,浏览器会将数据保存在本地磁盘中
cookie.setMaxAge(60*60*24*7);//一周后清除
//正数:存在硬盘上
//负数:默认值-1,存在浏览器内存中
//0:删除cookie
- 2.解决中文存储
tomcat7.0以前,Cookie不支持中文,使用URL编码解码。
现在tomcat8.5及以上支持中文cookie。
(1)Cookie中的中文存储乱码问题
String encode = URLEncoder.encode("张三", "utf-8");//编码
String decode = URLDecoder.decode(encode, "utf-8");//解码
//1.创建cookie
Cookie cookie = new Cookie("name", URLEncoder.encode("张三", "utf-8"));//编码
//设置保存时间
cookie.setMaxAge(60*60*24*7);
//2.响应cookie
response.addCookie(cookie);
//3.当浏览器二次请求时,取出
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie1 : cookies) {
if(cookie1.getName().equals("name")){
String value = cookie1.getValue();
String decode = URLDecoder.decode(value, "utf-8");//解码
System.out.println(decode);
}
}
}
(2)获取请求参数的中文乱码问题
get请求不用处理中文乱码
//getParameter获取请求参数,自动解码
String username = request.getParameter("username");
System.out.println(username);
//getQueryString获取请求参数,需要自己截取,自己解码
String queryString = request.getQueryString();
String[] split = queryString.split("=");
String decode = URLDecoder.decode(split[1], "utf-8");
System.out.println(decode);
2.服务端会话技术Session
1.Session会话域:它所代表的范围是一次会话,浏览器与服务器建立的一次链接,在这次链接中可以有多次请求和响应
2.Session可以在多次请求和响应间共享数据
3.Session由服务器创建,我们只需获取使用
- 存取数据
HttpSession session = request.getSession();
session.setAttribute("num","100");
HttpSession session = request.getSession();
Object num = session.getAttribute("num");
System.out.println(num);
- 原理:服务端会话技术Session要依赖于Cookie
//请求转发与重定向 都可以关系数据
response.sendRedirect(request.getContextPath()+"/demo2");
request.getRequestDispatcher("/demo2").forward(request,response);
- Session注意的细节
1.关闭浏览器后,再次请求。两次请求的jsessionid不一样,因为再次打开是一个新的会话,服务器会创建一个新的session对象,这个新的seesion对象里面你没有存任何数据,取得就是null。
2.关闭服务器后:
钝化:服务器正常关闭后,session对象会被存入硬盘中
活化:服务器再次开启后,将文件还原为内存session中
Session生命周期
- 1.创建
HttpSession session = request.getSession();
- 2.销毁
a.服务器关闭时
b.Session超时
可以在web.xml中配置Session的超时时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
c.自杀 session.invalidate();
- 3.安全退出
清除Cookie,销毁Session
消除Cookie,把存活时间设为0
销毁Session, session.removeAttribute();
客户端禁用了Cookie,Session如何自处
第一种方法:手动拼接
URL重写:http:localhost:8080/...;jsessionid=" ";
第二种方法:调方法
String href="/demo2";
href=response.encodeRedirectURL(href);
获取session
getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
getSession(boolean flag):
true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
四、小案例
1.(登陆) 记住用户名和密码
//登陆成功后,判断是否勾选了记住密码
String rember = request.getParameter("rember");
if(rember!=null){
//勾选了,保存用户名和密码
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setMaxAge(60*60*24*Integer.parseInt(rember));
cookie2.setMaxAge(60*60*24*Integer.parseInt(rember));//设置保存时间
response.addCookie(cookie1);
response.addCookie(cookie2);//发送到客户端
}
//如果勾选了,客户端取出数据,填写在表单中
<%
Cookie[] cookies = request.getCookies();
String uname ="";
String pword ="";
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
uname = cookie.getValue();
}
if(cookie.getName().equals("password")){
pword = cookie.getValue();
}
}
}
%>
用户名:<input type="text" name="username" placeholder="请输入用户名" value="<%=uname%>"/>
<br>
密码:<input type="password" name="password" placeholder="请输入密码" value="<%=pword%>"/>
2.(注册) 校验验证码
//将后台随机生成的验证码,存入session域对象中
String str="abcdefgABCDEFG1234567890";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= 4; i++) {
int index = random.nextInt(str.length());
char ch = str.charAt(index);
sb.append(ch);
g.drawString(ch+"",width/5*i,height/2);
}
//验证码设为session域对象
HttpSession session = request.getSession();
session.setAttribute("checkCode",sb.toString());//转换为字符串不要忘
//拿到用户输入的验证码
String code = request.getParameter("code");
//获取服务端生成的验证码
HttpSession session = request.getSession();
String checkCode = (String) session.getAttribute("checkCode");
//然后进行比对是否相同
//注意验证码只能使用一次
session.removeAttribute("checkCode");