第75节:Java中的JSP,EL和JSTL
哭吧看不完的!!!
Cookie和`Session
请求转发和重定向的区别:
地址不一样
请求次数也不一样
数据无法传递
4.跳转范围有限制
效率
请求转发请求1次,只能对当前项目跳转,重定向请求2次.重定向是无法传递的,重定向对跳转范围没有限制.
Cookie是服务器发送给客户端,存储在客户端的小数据.发送cookie:
Cookie cookie = new Cookie("key", value");
response.addCookie(cookie);
服务器返回cookie给客户端
// 响应头
Set-Cookie: a=b复制代码
接收cookie
Cookie[] cookies = request.getCookies();
客户端提交数据的cookie
// Cookie: a=b;c=d;
复制代码
Cookie分会话cookie和持久cookie
关闭cookie,可以关闭浏览器.
持久的cookie,在一段时间内有效
Cookie cookie = new Cookie("a","b");
cookie.setMaxAge(); // 秒
response.addCookie(cookie);
cookie.setDomain(".dashucoding.com");
// 只有带上这个域名的时候,才会有cookie
// 例如:www.dashucoding.com
cookie..setPath("/Demo");
// 要进行访问上面的路径才会带cookie
复制代码
移除cookie
Cookie cookie = new Cookie("a","b");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
// 获取以前cookie,设置有效期
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtil.findCookie(cookies,"a");
cookie.setMaxAge(0);
reponse.addCookie(cookie);
复制代码
cookie是存在客户端的.
可以创建一个新的cookie去替换
Cookie cookie = new Cookie("a","dashu");
cookie.setMaxAge(0);
response.addCookie(cookie);
复制代码
Session是基于Cookie的一种会话技术.cookie的安全隐患,是把数据存放在客户端,下次访问时,带上这个数据,服务端就知道客户端是谁.
Session的数据是存放在服务端.
session对应sessionid传递给客户端,是通过cookie传递的.只要有sessiondi,就可以获取以前的数据.
HttpSession session = request.getSession();
session.setAttribute();
sesssion.getAttribute();
复制代码package com.dashucoding.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class Demo01
*/
public class Demo01 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session = request.getSession();
// 得到会话ID
session.getId();
// 存值
//session.setAttribute(name, value);
// 取值
//session.getAttribute(name);
// 移植
//session.removeAttribute(name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
复制代码
session创建:
request.getSession
复制代码
销毁
关闭服务器,或自动会话过期,默认时间为30分钟.
在进行访问浏览器时,再次重启是无法获取以前的数据的,因为sessionid是通过cookie来传递的,cookie没有设置有效期,关闭后,就cookie删除了,同时cookie带过来sessionid同样也没有了.
手动设置cookie
String id = request.getSession().getId();
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setMaxAge(60*60*24*7);
response.addCookie(cookie);
复制代码
JSP和EL和JSTL
什么是JSP
JSP就是一个网页而已,或者是一个Java类,继承了servlet,所以jsp是一个servlet.
jsp设计目的是因为html是显示静态内容,有时网页要一些动态数据.html是不支持java代码,jsp支持java代码.
写法
指令
language
contentType内容类型
content-Type="text/html;charset=UTF-8"
pageEncoding jsp内容编码
复制代码extends="httpjspbase"
用于指定jsp翻译成java文件后,继承的父类是谁
import导包使用,一般不用手写
session
true or false
errorPage 错误的页面.
isErrorPage="true" 显示错误
errorPage="error.jsp" 呈现错误
errorPage 值需要给错误的页面路径
include
--%>
把另外一个页面的内容拿过来
--%>
url标签库的路径
prefix别名
复制代码
include和forward
--%>
复制代码 --%>
等同于以下代码 --%>
//请求转发
//request.getRequestDispatcher("other02.jsp").forward(request, response);
%>
复制代码
jsp: param
复制代码
小结
什么是JSP
为什么会有JSP
三大指令集
page
有什么用,那么怎么用,有哪些常用的属性
include
有什么用,那么怎么用
taglib
有什么用,怎么用
JSP动作标签
jsp:forword
jsp:include
jsp:param
复制代码jsp的内置对象
四个作用域
pageContext
request
session
appiication
复制代码
JSP内置对象
内置对象是在jsp页面中使用的这些对象,不用创建
pageContext
request
session
application
exception
out
page
config
response
复制代码application: ServletContext
config: ServletConfig
out: JspWriter
page: Object
pageContext: PageContext
request: HttpServletRequest
session: HttpSession
复制代码final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
request, response
复制代码
四个作用域
pageContext
request
session
application
复制代码
作用域,就是这个对象可以在哪用,对象可以存值,取值范围限定.
作用的对象是不一样的
setAttribute
getAttribute
复制代码pageContext:作用域只能在当前页面,PageContext
request:作用域限于一次请求
只要服务器做出反应,域中的值就没有了HttpServletRequest
session:限于一次会话,第二次会话就没了,HttpSession
application:都有,都可以访问,只有服务器关闭后就不能访问了.->ServletContext
一个工程只能有一个
复制代码exception -> Throwable
config -> ServletConfig
page -> Object -> 当前类的实例
response -> HttpServletResponse
out JSP -> JSPWriter
复制代码
out
response.getWriter
复制代码
out对象输出的内容是放到response的缓冲区内的,先输出response本身的内容,然后才是out里面的内容.
exception -> Throwable
page -> Object -> 一般就是jsp翻译成java类的实例对象 -> this -> 当前实例类
config -> ServletConfig
复制代码out -> JspWriter
response -> HttpServletResponse
复制代码pageContext -> PageContext: 作用域当前页面
request -> HttpServletReques: 作用域限于一次请求
session -> HttpSession -> 作用域限于一次会话
application -> ServletContext
整个工程可以访问,服务器关闭后就不能进行访问了
复制代码pageContext 也可以获取其他8个内置对象
复制代码
EL表达式:
是什么,怎么用,也有内置对象?
// 作用域
pageScope
requestScope
sessionScope
applicationScope
复制代码// 请求头
header
headerValues
复制代码参数
param
params
复制代码
EL表达式
简化jsp中java的代码.
${ 表达式 }
复制代码
取值方式:
String [] a = {"aa","bb","cc","dd"};
pageContext.setAttribute("array", a);
%>
User user = new User {"zhangsan",18};
session.setAttribute("u", user);
%>
${u.name}, ${u.age}
复制代码
pageEncoding="UTF-8"%>
Insert title here
从域中取值。 得先存值。
//pageContext.setAttribute("name", "zhangsan");
session.setAttribute("name", "lisi...");
%>
直接指定说了,到这个作用域里面去找这个name
${ pageScope.name }
//先从page里面找,没有去request找,去session,去application
${ name }
指定从session中取值
${ sessionScope.name }
---------------------------------------------
User user = new User("zhangsan",18);
session.setAttribute("u", user);
%>
${ u.name } , ${ u.age }
${ a > b}
${ a gt b }
${ empty u }
复制代码package com.dashucoding.domain;
public class User {
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
复制代码
pageEncoding="UTF-8"%>
Insert title here
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
按普通手段取值
使用EL表达式取出作用域中的值
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
${name }
-----------------------------
String [] a = {"aa","bb","cc","dd"};
pageContext.setAttribute("array", a);
%>
使用EL表达式取出作用域中数组的值
${array[0] } , ${array[1] },${array[2] },${array[3] }
-------------集合数据----------------
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
//pageContext.setAttribute("li", list);
session.setAttribute("li", list);
%>
使用EL表达式取出作用域中集合的值
${li[0] } , ${li[1] },${li[2] },${li[7] }
-------------Map数据----------------
Map map = new HashMap();
map.put("name", "zhangsna");
map.put("age",18);
map.put("address","北京..");
map.put("address.aa","深圳..");
//pageContext.setAttribute("map", map);
application.setAttribute("m", map);
%>
使用EL表达式取出作用域中Map的值
${applicationScope.m.name } , ${m.age } , ${m.address } , ${m["address.aa"] }
复制代码EL表达式隐式对象
11个内置对象
${ }
复制代码pageCotext
pageScope
requestScope
sessionScope
applicationScope
复制代码请求参数
param
paramValues
请求头
header
headerValues
cookie
initParam初始化参数
复制代码pageContext是PageContext实例,其他都是Map类.
复制代码
EL内置对象
// 作用域
pageScope
requestScope
sessionScope
applicationScope
// 请求头
header
headerValues
// 请求参数
param
params
cookie
全局初始化参数
initparam
pageContext
复制代码引入
pageEncoding="UTF-8"%>
Insert title here
这是el03页面
复制代码
pageEncoding="UTF-8"%>
Insert title here
这是el04页面
使用EL表达式获取这个参数
${cookie.name } --%>
${param.address }
复制代码
小结案例
pageEncoding="UTF-8" %>
--%>
--%>
Insert title here
--%>
这是other页面的内容.