<pre>
day10
上节内容回顾
1、jsp的入门
*在jsp里面如何嵌入java代码
**有三种 <%! %> <%= %> <% %>
*jsp就是servlet,最终也会被编译成servlet,放到tomcat的work目录里面
2、el入门
*获取域对象里面的值
*${域对象的名称}
3、cookie
*cookie分类
**有两种:会话级别的cookie和持久性的cookie(使用方法setMaxAge方法)
*创建cookie:new Cookie("","")
*把cookie回写到浏览器里面 response.addCookie(cookie);
*销毁持久性的cookie
第一:创建一个和要删除cookie相同名称的cookie,值""
第二:设置有效时长是0
第三:设置有效路径
第四:把cookie回写到浏览器内存
4、session
*session是服务器端技术,依赖于cookie。
*session的创建、销毁
**创建:执行request.getSession()
**销毁有三种
*tomcat里面进行配置、先编码再解码
**第三种:调用方法
*禁用cookie之后,使用session
**在地址后面加一个;jsessionid=id值
思维导图
1、jsp
(1)java server pages:java服务器端的页面,jsp运行在服务器(tomcat里面)
*之前学过servlet,sun公司开发用于动态网站的技术,还有一个jsp
**先有的servlet,因为servlet如果向页面输出内容太麻烦了,所以sun公司开发jsp可以方便向页面进行输出
(2)jsp就是servlet,jsp最终也会被编译成servlet,会放到tomcat的work目录里面
*jsp在什么时候编译成servlet:请求jsp时候编译成servlet
(3)jsp组成:html+java代码+jsp自身
(4)在jsp里面要嵌入java代码有三种方式
第一种:<%! %>,如果定义变量是成员变量
第二种:<%= %>,向页面输出,生成servlet在service方法里面out.print("hello" );
第三种:<% %>,写java代码,生成的servlet也在service方法里面
(4)jsp的注释
*jsp组成:html+java代码+jsp自身
**html的注释
**java的注释
**jsp自身的注释 <%-- jsp自身的注释 --%>
* 在jsp的源代码阶段:这三类注释都存在
* 在jsp编译成servlet之后:html注释和java注释存在,JSP注释会消失。
* jsp最终向页面输出之后:只是html注释存在
*在jsp里面如果嵌入java代码,不能使用html的注释,而要是jsp自身的注释
<%--
<%
for(inti=0;i<2;i++) {}
%>
--%>
(5)jsp的有三个指令
*jsp指令的语法:首先jsp里面的指令要写在jsp页面最上面(不包括include指令)
<%@ 指令的名称 属性的名称="属性的值"%>
属性名称写的时候严格区分大小写。
第一个:page指令,设置jsp页面的一些信息
<%@page 属性名称="属性的值"%>
*page指令里面的属性
**language属性:表示jsp支持的语言的类型,目前只支持java
**extends属性:表示jsp编译成servlet,继承的类,一般不需要修改,默认继承的类HttpJspBase
***原则:可以改变这个继承的类,但是这个类必须要是一个servlet
**session属性:表示在jsp里面是否可以直接使用session对象,属性的值是true和false
***在默认的情况下,session属性的值是true
=代码
<%
//request.getSession().setAttribute("aa","itheima");
session.setAttribute("aa","itcast");
%>
<%=session.getAttribute("aa")%>
**import属性:表示在jsp导入依赖的包
=代码(可以分别写,也可以写在一起)
与java不同,jsp快速导包不是ctrl+shift+o,而是将光标放在类名的后面,alt+/。
<%@page import="java.util.Date"%>
<%@page import="java.util.List,java.util.ArrayList"%>
**buffer:jsp输出的缓冲区的大小,默认的值 8kb
**autoFlush:jsp输出如果超出了缓冲区的大小,是否会正常输出
**errorPage属性:如果jsp运行的时候出现了异常,设置异常跳转到错误页面(虽然
页面的内容发生了变化,但是地址栏没有发生变化,说明跳转采用的
是转发机制。)
**isErrorPage属性:在错误页面里面,是否显示错误信息,默认false.
***一般用在程序员调试程序时候,但是如果系统要给客户,isErrorPage一定要设置成false
=当在错误页面里面把属性的值设置成true之后,才能在errorPage页面来使用
exception这个内置对象。
==编译的servlet里面生成了代码
java.lang.Throwable exception =org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
* contentType:设置打开jsp时候浏览器的编码
* pageEncoding:jsp编译成servlet,编译成servlet时候采用的编码
pageEncoding="utf-8",默认的编码是iso8859-1
*isELIgnored:jsp里面是否忽略el表示(jsp是否可以使用el表达式),默认值false,表示不忽略(可以使用)
**如果想要在jsp里面使用el表达式,需要把这个属性值设置成false。如果设置成true,会把el表达式当做普通文本输出
**重点掌握的属性: session 、import 、 errorPage 、 pageEncoding
第二个:include指令,用于包含页面的指令(静态包含)
*支持多层嵌套,这样除了最外层的JSP,其它的JSP页面都可以不用写html代码,
直接写内容即可。
*在一个jsp里面包含其他的jsp里面内容
*语法: <%@ include 属性="属性值"%>
= <%@ include file="head.jsp"%>
*注意一:当包含某个jsp页面时候,在包含的的页面里面不需要写html的代码了,只需要写包含的内容
*注意二:在include指令的file属性里面不能写参数,即加上?id=1等等内容。
*注意三:在include的file属性里面不能写变量
*注意四:在include的file属性里面路径不能加项目名。
*jsp最终要编译成servlet,有多个jsp页面,最终会编译成几个servlet?
*使用include指令包含多个页面,最终会编译成一个servlet
*静态包含相当于代码复制,把多个jsp里面的内容复制到一个jsp里面,生成一个servlet
第三个:taglib指令
*作用:经常和jstl标签库一起使用,替代页面中的<% %>
*语法:<%@ taglib uri="jstl标签库的路径"prefix="标签库的别名"%>
*掌握程度:
第一:知道jsp里面有三个指令以及这三个指令的名称
第二:三个指令分别可以做什么以及如何做
问题:jsp里面有哪些指令?
答:jsp里面有三个指令,这三个指令分别是 page、include和taglib
page指令可以设置页面的信息,里面重要的属性是session、import、errorPage、pageEncoding
include表示包含其他的jsp页面
taglib可以和jstl使用替代页面中<%%>
(6)jsp的内置对象
*什么是内置对象:在jsp里面可以直接使用的对象称为内置对象
*在jsp里面有九个内置对象
request:就是servlet里面HttpServletRequest对象,代表请求,域对象,获取提交的数据,获取客户机信息
response:就是servlet里面HttpServletResponse对象,代表响应,回写cookie,向页面输出
sesssion:就是servlet里面HttpSession对象,域对象
config:就是servlet里面ServletConfig对象,获取servlet名称,获取初始化参数
application:是servlet里面的ServletContext对象,域对象,获取全局初始化参数,读取web项目中文件
exception:代表异常对象
*如果想要使用,必须要把属性isErrorPage设置成ture才可以使用
java.lang.Throwable exception =org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
page:代表jsp编译成servlet,当前运行的servlet这个对象
out:向页面输出的对象
* out和response.getWriter()区别
**out使用的是JspWriter,response.getWriter()使用的是 PrintWriter
*out和response.getWriter()输出机制
**产生两个缓冲区out和response
***out不能直接向页面输出,把out里面的值放到response缓冲区里面,通过response向页面输出
pageContext(****)
第一:本身就是一个域对象
**pageContext只是在jsp里面可以使用,当前页面。
**设置值 setAttribute(String name, Object value)
**取值 getAttribute(String name)
=代码
<%
pageContext.setAttribute("msg","itcast100");
%>
<%=pageContext.getAttribute("msg") %>
第二:pageContext可以向域对象里面设置值
*servletContext(在jsp里面application)、session、request
(1)设置值的方法:setAttribute(String name, Object value, int scope)
第三个参数:表示是哪个域
*使用pageContext的常量表示不同的域
*如果是application,使用APPLICATION_SCOPE
*如果是session,使用SESSION_SCOPE
*如果是request,使用REQUEST_SCOPE
*如果是pageContext,使用PAGE_SCOPE
(2)取值的方法:getAttribute(String name,int scope)
第二个参数:表示是哪个域
*使用pageContext的常量表示不同的域
*如果是application,使用APPLICATION_SCOPE
*如果是session,使用SESSION_SCOPE
*如果是request,使用REQUEST_SCOPE
*如果是pageContext,使用PAGE_SCOPE
=代码
<%
pageContext.setAttribute("app","appvalue", pageContext.APPLICATION_SCOPE);
pageContext.setAttribute("sess","sessvalue",pageContext.SESSION_SCOPE);
pageContext.setAttribute("req","reqvalue", pageContext.REQUEST_SCOPE);
pageContext.setAttribute("page1","page1value", pageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute("app",pageContext.APPLICATION_SCOPE) %>
<%=pageContext.getAttribute("sess",pageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("req",pageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("page1",pageContext.PAGE_SCOPE) %>
(3)findAttribute(String name) 方法(注意这个方法是pageContext对象
所特有的方法)
*表示从域对象里面获取值,如果多个域对象里面的值相同的,得到域范
围小的里面的值《** 如果只设置 了application域的属性值,在360浏
览器中获取不到值!!****》
*四个域对象!!!!!!!!!!!!!!!!!!!!!!!!!
**pageContext:范围当前的页面有效(这个域对象只是在jsp里面使用)
**request:范围一次请求
**session:范围是一次会话
**application:范围是整个web项目
第三:pageContext可以获取其他八个内置对象
*只需要得到pageContext,就可以得到jsp里面的其他的八个内置对象
* <%
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
//....
%>
*掌握程度:九个内置对象是什么,九个内置对象分别可以做什么
==========================================================================================
上午内容的总结
1、jsp的三个指令
*page 、include、taglib
2、jsp的九个内置对象
request
response
session
config
application
exception
page
out
*out和response输出机制
pageContext
*第一:域对象,这个域对象只能在jsp里面使用
*第二:向其他域对象里面设置值
*第三:获取其他的八个内置对象
(7)jsp的动作标签
(代码位置:/day10/WebRoot/jsp)
*语法: <jsp:标签名称属性="属性值"></jsp:标签名称>
*在jsp里面可以实现的一些功能
*在jsp里面有六个动作标签
第一类:与javabean没有关系的动作标签(有三个)
**<jsp:forward></<jsp:forward>:实现在jsp里面转发的操作(注意路径不能有项目 名)
***<jsp:forward page="/jsp/hello.jsp" ></jsp:forward>
***类似于servlet里面执行request.getRequestDispatcher(...).forward(....);
** <jsp:include></jsp:include>: 表示包含页面(动态包含)
***有多个jsp,多个jsp会编译成几个servlet?
***有多个jsp会编译成多个servlet。
=代码 <jsp:include page="head.jsp"></jsp:include>
**已经有一个include标签的jsp页面,不能再被其它的jsp页面的jsp:forward、
jsp:include页面使用。
** <jsp:param></jsp:param>: 传递参数
***一般用在有路径的动作标签里面
***类似于get提交
****http://127.0.0.1/day10/login?id=1
=代码
<!-- 使用动作标签实现转发 -->
<!-- 类似于进行转发的操作,在地址后面添加参数hello.jsp?id11=zhangsan -->
<jsp:forwardpage="/jsp/hello.jsp">
<jsp:paramvalue="zhangsan" name="id11"></jsp:param>
</jsp:forward>
****标签中有中文提交的数据乱码。
第二类:与javabean有关系的动作标签(有三个)
**<jsp:useBean>: 表示设置要操作哪一个javabean
**<jsp:setProperty>: 向javabean里面设置值
**<jsp:getProperty>: 从javabean里面获取值
2、javabean(******)
(1)什么是javabean:就是一个java类,这个java类要遵循一定的书写规范
*书写规范
第一个规范:javabean里面需要有一个公开的没有参数的构造方法
第二个规范:javabean里面的属性私有的
第三个规范:javabean里面的属性需要通过公开的方法暴露出来(set和get方法)
(2)javabean主要的功能是用于存储数据的(封装数据)
*通过set方法向javabean里面设置值,通过get方法从javabean里面获取值
(3)如何向javabean里面封装数据
*创建一个页面,在页面里面写表单,表单提交到一个servlet里面去,在servlet里面获取表单的数据,
使用下面的三种方式把数据封装到javabean里面
*第一:使用传统方式向javabean里面封装数据
(代码位置/day10/src/cn/itheima/servlet/Bean1Servlet.java)
=代码
//创建Person的对象
Personp = new Person();
//使用Person里面set方法设置值
p.setUsername(username);
p.setAge(age);
System.out.println(p.toString());
*第二:使用jsp的动作标签向javabean里面设置值
(代码位置/day10/WebRoot/javabean/bean02.jsp)
* ** <jsp:useBean>: 表示设置要操作哪一个javabean
**<jsp:setProperty>: 向javabean里面设置值
**简写方式: <jsp:setProperty property="*"name="p1"></jsp:setProperty>
**要求:表单输入项的name的值必须要和javabean里面的属性名称一样
**<jsp:getProperty>: 从javabean里面获取值
**使用这个标签时候,没有* 的效果,只能一个一个去取值
**当在jsp里面写<jsp:useBean id="p1" class="cn.itheima.bean.Person"scope="page"></jsp:useBean>
生成下面的代码:
cn.itheima.bean.Person p1 = null;
p1 = (cn.itheima.bean.Person)_jspx_page_context.getAttribute("p1",
javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (p1 == null){
p1= new cn.itheima.bean.Person();
_jspx_page_context.setAttribute("p1",p1, javax.servlet.jsp.PageContext.PAGE_SCOPE);
}
=代码
<jsp:useBean id="p1" class="cn.itheima.bean.Person"scope="page"></jsp:useBean>
<%-- <jsp:setPropertyproperty="username" name="p1"></jsp:setProperty>
<jsp:setPropertyproperty="age" name="p1"></jsp:setProperty>--%>
<!-- 简写方式向javabean里面设置值
要求:表单输入项的name的值必须要和javabean里面的属性的名称要一样
-->
<jsp:setProperty property="*"name="p1"></jsp:setProperty>
<jsp:getPropertyproperty="username" name="p1"></jsp:getProperty>
<jsp:getPropertyproperty="age" name="p1"></jsp:getProperty>
*第三:小型的框架BeanUtils,通过这个框架向javabean里面设置值
(代码位置/day10/src/cn/itheima/servlet/Bean2Servlet.java)
*要求:表单输入项的name的值必须要和javabean里面的属性的名称一致
*如果使用jsp动作标签只能在jsp里面使用,不能在servlet里面使用。
如果想要在servlet实现类似的效果,需要实现一个小型的框架来实现
*使用框架 BeanUtils封装数据到javabean(类库)
**这个框架不是javaee的一部分,如果想要使用首先导入jar包,beanutils需要两个jar包
*beanutils是Apache组织开发框架,用于封装数据到javabean
*使用类org.apache.commons.beanutils包里面的类 BeanUtils
*框架里面使用的方法 populate(Object bean, Map properties) ,
**通过这个方法完成数据封装到javabean
**这个方法里面传递两个参数:
***第一个参数是要封装的javabean对象
***第二个参数是map集合,使用getParameterMap的map值,这个map值的结果是key是表单输入项name的值,
value是输入的值
*如何向web项目中导入jar包
**导入方式:复制jar包,复制到web项目里面的一个文件夹 WEB-INF/lib 下面就可以了
=代码
//创建javabean对象
Personperson = new Person();
try{
BeanUtils.populate(person,request.getParameterMap());
}catch (Exception e) {
e.printStackTrace();
}
3、el表达式
(1)el表达式用于获取域对象里面的值
*语法: ${域对象值的名称}
(2)el表达式如何获得域对象值
(代码/day10/WebRoot/el/el01.jsp)
*首先创建jsp页面,在jsp里面分别向四个域对象里面设置值
*使用el表达式获取四个域对象里面的值
=代码一:
<%
application.setAttribute("app","appvalue");
session.setAttribute("sess","sessvalue");
request.setAttribute("req","reqvalue");
pageContext.setAttribute("page","pageValue");
%>
<!-- 使用el表达式获取 -->
${app }
${sess }
${req }
${page }
* 向四个域对象里面设置值,名称都相同
** 获取四个域对象里面相同名称的值,在el表达式里面加上一个scope
= 代码二:
<%
application.setAttribute("itheima","appvalue1");
session.setAttribute("itheima","sessvalue1");
request.setAttribute("itheima","reqvalue1");
pageContext.setAttribute("itheima","pageValue1");
%>
<!-- 获取四个域对象里面名称相同的值-->
<!-- 获取pageContext域里面的值 -->
${pageScope.itheima }
<!-- 获取request域里面的值 -->
${requestScope.itheima }
<!-- 获取session域里面的值 -->
${sessionScope.itheima }
<!-- 获取servletcontext域里面的值 -->
${applicationScope.itheima }
(3)el表达式如何获取域对象里面的数组、集合、对象的值
*向域对象里面放数组,如何取值?
**数组的下标开始位置是0,
**使用el表达式获取下标不存在,返回空字符串""
(代码/day10/WebRoot/el/el02.jsp)
=代码
<!-- 向域对象放数组,取值的方法 -->
<%
String[]arr = {"lucy","jack","mary"};
//把数组放到域对象里面
request.setAttribute("arr",arr);
%>
<!-- 使用el表达式获取域对象里面的数组的值
也是通过数组的下标取值
-->
${arr[10] }
*向域对象里面放list集合
(代码/day10/WebRoot/el/el02.jsp)
**使用下标获取,使用el表达式获取下标不存在,返回空字符串""
**使用el表达式不能获取set集合里面的值,set集合无序的
=代码
<%
List<String>list = new ArrayList<String>();
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
//把list集合放到域对象里面
request.setAttribute("list",list);
%>
<!-- 使用el表达式获取域对象里面的list集合的值
也是使用下标获取
-->
${list[20] }
* list和set的区别
*向域对象里面放map集合
(代码/day10/WebRoot/el/el02.jsp)
*使用域对象名称.key的名称,得到value值
=代码
<%
Map<String,String>map = new HashMap<String,String>();
map.put("NAME","ZHANGSAN");
map.put("AGE","100");
map.put("ADDR","TIANJIN");
//把map集合放到域对象里面
request.setAttribute("map",map);
%>
<!-- 使用el表达式获取域对象里面的map值 -->
${map.NAME }
${map.AGE}
${map.ADDR }
*获取域对象里面的对象的属性的值
(代码/day10/WebRoot/el/el03.jsp)
**使用域对象名称.属性的名称
=代码
<%
Personp1 = new Person();
p1.setUsername("WAGNWU");
p1.setAge("200");
//把p1放到域对象里面
request.setAttribute("person",p1);
%>
<!-- 使用el表达式获取person对象里面的属性的值-->
${person.username }
${person.age }
========================================================
今天内容的总结
(1)掌握jsp里面如何嵌入java代码
(2)掌握jsp里面三个指令
*page、include、taglib(和jstl标签库使用,替代页面中的<%%>)
(3)掌握jsp里面九个内置对象
*九个内置对象是什么,九个内置对象做什么事情
*out对象:out输出机制
*pageContext对象
=域对象
=向其他的域对象里面设置值
=获取其他的八个内置对象
(4)掌握四个域对象的范围
*application、session、request、pageContext
(5)掌握jsp里面的六个动作标签
*第一类:与javabean无关的标签(会用)
*第二类:与javabean有关的标签有三个(******)
=<jsp:useBean>
=<jsp:setProperty>
=<jsp:getProperty>
(6)掌握javabean
*什么是javabean(遵循的规范)
*javabean作用:封装数据
*如何向javabean里面封装数据(三种)(****)
**如果使用beanutils框架首先导入jar包
**如果向web项目中导入jar包
(7)el表达式
*el表达式获取域对象里面的值(全写的方式)
*el表达式获取域对象里面的数组、list、map、对象里面的属性的值的操作
===================================================
完成任务:
(1)背下来jsp三个指令,九个内置对象,六个动作标签,四个域对象
(2)把封装数据到javabean代码至少写一遍
(3)把使用el表达式获取域对象里面值,和对象里面的数组、list、map、对象里面的属性的值的代码至少写一遍
</pre>