JSP
jsp是服务器技术 java server pages
JSP,EL表达式的入门(要用)
Servlet/JSP 是两种动态的web资源的两种技术。
使用Servlet生成HTML的页面
response.getWriter("<form action='' method='post'>")
response.getWriter("<input type = 'text' name='username'>");
JSP简介
java server pages java服务器端的的网页们,是在服务器端执行的
JSP不仅可以写html+java代码+jsp自己的代码
jsp的运行原理(****):jsp -- 翻译成Servlet -- 编译 -- 访问
JSP的脚本元素(jsp可以编写java代码)
<%! %> :定义类,定义变量,定义方法(不常用) 成员变量
<%= %> :输出语句(输出到页面,不能有分号)
<% %> :定义变量,语句 局部变量在server方法里面
EL快速入门
获取域对象中的内容 request.setAttribute("xx","yy");
${xx}
两个会话技术
会话:打开浏览器,可以访问web资源。多次访问web资源,关闭浏览器,整个过程为一次会话
例子:
购买商品
用户点击超链接通过了一个servlet购买了一些商品,程序应该保存用户购买的商品
以便于用户点结账servlet时,结账servlet可以得到用户商品为用户结账
把商品存入到ServletContext获取request域中呢?
cookie
显示上次的访问时间
第一次访问,输出欢迎,在服务器端,记录当前的时间,把当前的时间通过cookie回写到浏览器
判断是否是第一次访问呢?
通过指定名称来查找,如果没找到,就是第一次访问
回写到浏览器
void addCookie(Cookie cookie) Cookie(String name, String value)
获取cookie的内容
Cookie[] getCookies()
第二次访问,输出上次访问时间,获取时间,可以把时间显示到页面上,记录当前时间,再把回写到
浏览器,输出上次的访问时间
Cookie的api
构造方法 Cookie(String name, String value)
String getName() 获取cookie的名称
String getValue() 获取cookie的值
void setMaxAge(int expiry) :设置有效时间
失效的cookie setMaxAge(0); 前提条件:设置有效路径(和之间设置过相同)
void setPath(String uri) :设置有效路径
默认的路径()
配置 /last 默认路径 /day11
配置 /servlet/last 默认路径 /day11/servlet
void setDomain(String pattern) :设置有效域名
www.sina.com.cn
sports.sina.com.cn
xxx.sina.com.cn
设置有效域名 setDomain(".sina.com.cn")
会话级别的Cookie:默认保存再浏览器内存中
持久的cookie:把cookie保存早磁盘上,setMaxAge()
显示用户上次访问过的商品信息(需求)
浏览记录
* 1.获取请求的参数
* 2.获取cookie,通过名称(自己指定)查找cookie
* 3.如果cookie==null,第一次访问
* 如果是第一次访问,创建cookie,回写浏览器
* 4.如果cookie!=null,不是第一次访问
* 如果不是第一次访问,说明我的cookie中已经存在id
* 判断,当前id是否已经存在cookie的中value
* 如果存在,不用操作
* 如果不存在,在后面追加(product = 1,2)
* 5.重定向商品页面
session(服务器端)
cookie基于客户端,不安全,并且有大小和个数的限制
服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器独占一个session对象(默认情况)
session域对象,范围一次会话范围,存个人相关的数据。
void setAttribute(String name, Object value)
Object getAttribute(String name)
String getId()
void invalidate() 3
完成简单的购物车
购物车 Map<String,Integer> cart 把购物车存入seesion中
获取数据
判断是否是第一次访问 session.getAttribue("cart");
如果是第一次访问,cart创建一个购物出,放入商品的名称和数量
如果不是第一次访问,cart!=null,判断是否包含该商品?
如果包含,数量拿出来,++,放回去,存入seesion中
如果不包含,正常放入到购物车中,存入seesion中
session的追踪
session.getId()
session的创建和销毁
第一次访问资源,调用request.getSession(),常见session
销毁:
非正常关闭服务器
session的过期,默认是30分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
调用session.invalidate() 手动销毁session
session的域对象
ServlerCOntext: 代表整个web应用,数据库链接
session 一次会话,存放个人的信息
request 一次请求,存放错误的处理
jsp的设置
设置jsp文件的打开方式:window-选项--General--Editors--文件的管理--选择MyEclipes JSP Editor --default
设置编码windows--搜索jsp--找到utf-8
JSP页面注释
HTML的注释 全程存在
JAVA的注释 之间都存在,在html阶段不存在
jsp注释 <%-- JSP的注释--%> 只存在jsp文件阶段,以后就不存在了
JSP指令元素
语法:<%@ 指令元素 属性名=属性值 %>
page 设置jsp的属性
注意:import属性可以出现多次。其他属性只能执行一次
属性:
language :jsp文件允许嵌入的语言。只支持一种语言java
extends :jsp翻译成Servlet文件,servlet继承的一个类,默认
JspHttpBase
*session :默认值是true,可以直接使用session。设置false,
不能直接使用
*import :引入jar包(使用多次)
buffer :设置缓冲区的大小 默认8kb
aotoFlush :设置默认刷新缓冲区(不要修改)
errorPage: 指定错误页面
isErrorPage: 设置值,可以是exception对象
*contentType: :服务区端输出所有类容采用的编码
*pageEncoding :jsp翻译成Servlet文件时采用的编码
*isELIgnored :是否忽略EL表达式i(false,不忽略,true,
忽略)
include 包含页面(页面布局)
语法:<%@ include file="包包含文件的地址(静态包含)" %>
可以把多个页面放在一个页面中
静态包含的原理:body.jsp->body_jsp.java
在翻译成body_jsp.java之前,把全部内容都复制在一起
taglib 引入标签库文件
语法:<%@ taglib%>
属性
uri:引入标签库的名称
prefix:标签库的前缀名
配置全局的错误页面
在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/jsp/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/jsp/500.jsp</location>
</error-page>
JSP的内置对象(9个)
request respinse session apolication out pageContext page
config exception
内置对象 真实对象 方法
request HttpServletRequest setAttribute() getAttribute()
response HttpServletResponse addCookie() getWriter()
session HttpSession setAttribute() getAttribute()
application ServletContext setAttribute() getAttribute()
config ServletConfig getInitParameter() getInitParameterNames()
exception Throwable getMessage()
和异常有关
前提条件:isErrorPage="true"
page Object (不使用)
当前页面的对象
out JspWriter write() print()
JspWriter(缓冲区也要先写入response.getWriter()的缓冲区中)
<!-- BBBB HELLO AAA CCCC -->
<%= "HELLO"%>
<% out.print("AAA");%>
<% response.getWriter().print("BBBB")%>
<% out.print("CCCC")%>
pageContext(域对象) PageContext getXXX()
是一个域对象
自己存取值
向其他的域中存取值
setAttribute(String name,Object value,int scope)
getAttribute(String name,int scope)
findAttribute(String name)
可以获取其他8个对象
编写框架或者通用性较高的代码。
在jsp的时候(4个域对象)
ServletContext 整个web应用
session 一次会话
request 一次请求
pageContext 当前页面
jsp的标签(jsp的动作)
<jsp:forward>:转发
属性:page 要转发的页面
<jsp:include>:页面的包含(动态包含)
属性: page 包含的页面
原理:自己编译自己的文件,拿到java文件后在组合在一起
<jsp:para>: 传递参数
属性:name 参数名称 value 参数的值
把数据封装在JavaBean中(jsp页面中完成)
<jsp:useBean>
<jsp:useBean id="u" class="cn.itcast.bean.User"></jsp:useBean>
<jsp:setProperty property="username" name="u"/>
<jsp:setProperty property="password" name="u"/>
<jsp:getProperty property="username" name="u"/>
<jsp:getProperty property="password" name="u"/>
<jsp:setProperty>
<jsp:getProperty>
内省(Introspector)
通过内省技术可以访问bean类的方法
基于反射
使用BeanUtils工具类
导包:
commons-beanutils-xxxxx.jar
commons-logging-xxxxx.jar
默认把字符串转换成日期类型
编写一个类,实现Converter接口,重写给方法。把字符串转换为日期
在封装之间进行注册。ConvertUtils.register(Converter converter,class clazz)
EL表达式
语法
${}
获取(域对象中)数据
<%
pageContext.setAttribute("name", "李四");
request.setAttribute("name", "张三");
%>
${ requestScope.name }
<h4>域中数组的值</h4>
<%
String[] arrs = {"张三","李四","王五","赵六"};
request.setAttribute("arrs", arrs);
%>
${ arrs[2] }
<h4>域中的集合的值</h4>
<%
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("list", list);
%>
${ list[1] }
<h4>域中Map集合的值</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("a","aa");
map.put("b","bb");
request.setAttribute("map", map);
%>
${map.b }
<!-- 特殊字符 ${map["b.c"]} -->
<!-- 获得域对象的值 $uList[2].username} -->
逻辑运算
<h4>EL的运算</h4>
<%
request.setAttribute("n1", 10);
request.setAttribute("n2", 10);
request.setAttribute("n3", 10);
request.setAttribute("n4", 10);
%>
${n1+n2 }
<h4>关系运算</h4>
<h4>大于</h4>
${ n1 > n2 } ${ n1 gt n2 }
<h4>小于</h4>
${ n1 < n2 } ${ n1 lt n2 }
<h4>等于</h4>
${ n1==n2 } ${ n1 eq n2 }
<h4>不等于</h4>
${ n1!=n2 } ${ n1 ne n2 }
<h4>大于等于</h4>
${ n1>=n2 } ${ n1 ge n2 }
<h4>小于等于</h4>
${ n1<=n2 } ${ n1 le n2 }
<h3>逻辑运算</h3>
<h4>与</h4>
${ n1 > n2 && n3>n4 } ${ n1 > n2 and n3>n4 }
<h4>或</h4>
${ n1 > n2 || n3>n4 } ${ n1 > n2 or n3>n4 }
<h4>非</h4>
${ !(n1 > n2) } ${ not(n1 > n2) }
获取WEB开发中的对象
pageScope
requestScope
sessionScope
application
param 获取请求参数 getParameter()
${ param.username } 当表单提交后
paramValues 获取请求的参数 getParameterValues()
header
headerValues
initParam 获取全局的初始化参数可以去web.xml里面配置
cookie 获取cookie
${cookie.last.value}
pageContext
${pageContext.request.remoteAddr }
//比较pageContext.getRequest().getRemoteAdder
调用java的方法
JavaBean
什么是JavaBean?
定义
必须要有一个无参的构造方法
属性私有化
私有化的属性必须通过public 类型的方法暴露给其他程序,并且方法的命名
也要遵循一定的规范(getXXX() setXXX())
作用:封装数据