1.jsp概念:Java Server Page Java 服务页面。
特点:即能写HTML CSS JS 他还能写 Java代码。
作用:简化页面的书写。
jsp的本质是servlet。
2.在jsp上使用特定的语法编写java的代码
早期脚本(不推荐大量使用)
1.<%----%> 注释
2.<%! %> java代码的成员位置
3.<% %> 在servlet的service的方法中(在后台展示)
4.<%="abc"%> 生成的代码在 prinlt("abc")(在前台展示)
3.刷新头(三秒跳转)
案例2-当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面
技术分析:
定时刷新
常见的响应头-refresh
响应头格式:
refresh:秒数;url=跳转的路径
设置响应头:
response.setHeader(String key,String value);设置字符串形式的响应头
response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
设置定时刷新:
response.setHeader("refresh","3;url=/day0901/login.htm");
步骤分析:
登录失败之后,修改业务逻辑
打印之后添加一个头信息即可
4.会话技术:解决客户端和服务端的数据共享问题,因为http协议是一种无状态协议(不会记录上次访问的记录),所以通过会话数据,实现多次数据的共享。
会话:是服务器与客户端浏览器之间建立起来的一次通信,在这一个通信中实现一次或者多次请求或者响应,实现服务器和客服端的数据之间的共享。
客户端会话技术(cookie):将数据保存在浏览器(服务端),可以减轻服务器的压力,数据不安全
原理:浏览器第一次请求服务器,服务器第一次响应会给一个set-cookie头+数据,把数据交给浏览器保存,浏览器第二次请求服务器,会带上数据通过cookie请求头带给服务器,服务器端可以取数据出来用。
代码展示:
第一个servlet给浏览器客户端发一个cookie的数据
public class cookieServlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("key", "value");
//发送cookie
response.addCookie(cookie);
}
第二个servlet获取浏览器客户端中的cookie中的数据
@WebServlet(name = "CookieServlet2",value = "/demo2")
public class CookieServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
//判断cookie是否为空
if (cookies != null) {
//遍历cookies数组
for (Cookie cookie : cookies) {
//获取cookie的键
String name = cookie.getName();
//判断cookie的键
if (name.equalsIgnoreCase("key")){
//获取cookie中的数据
String value = cookie.getValue();
System.out.println(value);
}
}
}
}
cookie的注意事项:
1.持久性问题:默认情况下,cookie中的数据是保存在浏览器的缓存中,浏览器关闭时,内存释放,cookie中的数据就没有了,处理方法:设置cookie保存数据的事件
在客户端设置存放cookie的时间
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("key", "value");
//设置cookie存活的时间,以秒为单位
cookie.setMaxAge(60*60);//这是存放一小时
//-1是默认值,直接保存在客户端,0是清除cookie,不允许存放cookie
cookie.setMaxAge(-1/0)
//在请求头中添加cookie
response.addCookie(cookie);
}
清除cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置与客户端的数据要一致
Cookie cookie = new Cookie("key", "value");
//设置cookie存放的时间为0
cookie.setMaxAge(0);
//发送回去
response.addCookie(cookie);
}
2.不能跨浏览器进行操作
3.cookie以前不支持中文,现在cookie可以直接存储中文,不需要进行编解码的操作
get请求中有提交的方式是通过(URLdecoder解码,URLencoder编码)
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
String name="张三";
//编码,参1为需要编码的字符串,参2为编码规则
String bmname = URLEncoder.encode(name, "utf-8");
System.out.println(bmname);
//解码,参1为需要解码的字符串,参2为编码规则
String jmname = URLDecoder.decode(bmname, "utf-8");
System.out.println(jmname);
}
}
3.服务端会话技术(Session):将数据存放在服务端(数据有保障,但会增加服务器的压力)
- 将数据存储在服务器端
- 原理:session依赖于cookie存在
Java实现Session:
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute(“msg”, “hehe”);
//3.获取数据
Object msg = session.getAttribute(“msg”);
session细节:
浏览器关闭了,session不一样了。
Cookie没了。jsessionid没了。
服务器关闭了,session一样吗?不一样。内存释放了。
优化:虽然对象不一样了,但是session中存储的数据还是一样的
钝化:服务器正常关闭后,session对象被写入硬盘的文件中
活化:服务器开启后,将文件还原为内存的session对象
session的生命周期
创建:
request.getSession():
会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
销毁:
服务器关闭
session超时
invalidate() :session自杀,处理安全退出。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.如果客户端禁用了 cookie,session该如何自处?
客户端禁用了cookie,session将不一样。
URL重写:http://localhost:8080/day09/s1;jsessionid=731DED0DC4F0AA06CDBB815733D4043E
PrintWriter pw = response.getWriter();
HttpSession session = request.getSession();
String id = session.getId();
String href = "/day09/s1";
href = response.encodeRedirectURL(href);
System.out.println(href);
pw.write("<a href='"+href+"'>s1</a>")
4.获取session:
getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
getSession(boolean flag):
true:默认值,会根id值查找是否存在sesison对象,如果没找到,则创建新的session
false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null