jsp 以及javabean内省技术
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsp 以及javabean内省技术相关的知识,希望对你有一定的参考价值。
l JSP
l JavaBean及内省
l EL表达式
1.1 上次课内容回顾
会话技术:
Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制.
Session:服务器端技术.将数据保存在服务器端.Session没有大小和个数限制.Session基于Cookie回写了一个JSESSIONID.
Cookie的分类:
* 会话级别的Cookie:浏览器关闭了,Cookie就销毁了!
* 持久化的Cookie:
* cookie.setMaxAge(时间); --- 存活指定的时间.
* cookie.setMaxAge(0); --- 销毁持久性Cookie.条件:必须路径得一致.
* 案例一:记录用户上次访问时间.
* 案例二:客户访问的浏览记录.
Session:
* 案例一:购物车
* 案例二:验证码
* session的追踪:浏览器禁用Cookie之后还想使用Session?
* URL重写:
* 在所有的地址路径后拼接;jsessionid=sessionID的值.
* response.encodeURL(url); --- 自动在URL地址后拼接jsessionid
* response.encodeRedirectURL(url); --- 在重定向的时候进行URL重写.
1.2 JSP
1.2.1 JSP概述:
什么是JSP
JSP:Java Server Pages. Java服务器端页面. 运行服务器上的.
JSP = html + Java + JSP自身
为什么学习JSP
SUN公司提出动态开发技术:Servlet.Servlet在使用的时候,发现了很多不足.(生成HTML页面的时候,需要配置运行).SUN公司意识到Servlet没有办法与ASP、php(LAMP:Linux Apache mysql PHP)进行竞争.所以SUN公司提出了一个动态网页开发技术JSP.
JSP好处:生成HTML页面的时候.
在哪些地方使用:
开发动态网页使用.一般情况下,单纯开发一个网站,一般不会使用JSP.SUN公司动态网页开发技术,应用在系统,网银系统...
1.2.2 JSP运行原理:
JSP--->服务器翻译成Servlet---->编译成.class执行的.
* 代码生成的JSP的源代码中:
* public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
* 看到HttpJspBase需要查看Tomcat源代码.就可以看到.HttpJspBase类继承HttpServlet.
<%! int a = 0 ;%> --- 翻译成Servlet的全局的东西.
<% int i = 1;%> --- 翻译成service方法内部的东西.
<%= i %> --- 翻译成service方法内部的out.print(i);
1.2.3 JSP的语法:
JSP的脚本元素:
在JSP中使用脚本元素在HTML代码中嵌入Java代码.
<%! %> --- 声明方法和变量.翻译成Servlet中的全局方法、全局变量.(使用很少!Servlet是单例的.线程安全问题.)
<% %> --- 声明不能是方法.翻译成Servlet中的service方法的局部变量、内部类.
<%= %> --- 声明一个表达式.翻译成Servlet中的service方法的out.print();
JSP的脚本元素的面试题:
<%! int x = 0; %> --- 声明全局变量x=0;
<%=x %> --- 输出全局变量x
<% x=5; %> --- 修改了全局变量x=5;
<% int x = 10; %> --- 声明了局部变量x=10;
<% this.x = 20; %> --- 修改全局变量x=20;
<%=x %> --- 输出的局部变量x
页面输出的内容是:0 10
* JSP的翻译中全局声明形式,会优先翻译.
JSP的注释:
JSP中支持HTML、Java、JSP注释
HTML注释方式: 存在于JSP代码中和翻译后的Servlet代码中及HTML页面的代码中.
<!-- HTML的注释 -->
Java代码注释: 存在于JSP代码中和翻译后的Servlet的代码中
<%
// 单行注释
/*
多行注释
*/
/**
* 文档注释
*/
%>
JSP的注释: 仅存在于JSP源代码阶段
<%-- JSP的注释 --%>
1.2.4 JSP的指令.
JSP中有三大指令:page、include、taglib指令.
指令的语法:
<%@ 指令名称 属性名称=属性的值 属性名称=属性的值...%>
Page指令:设置JSP页面的基本信息.
<%@ page language="java"%>
* language :设置JSP的脚本中使用语言.目前只能是java.(不需要修改.)
* SUN公司设计JSP是有野心.
* extends :设置JSP翻译成Servlet代码.翻译成Servlet后继承哪个类.(不需要修改.)
* 默认值:org.apache.jasper.runtime.HttpJspBase.这个值是可以修改的.但是继承的类必须是HttpServlet或者HttpServlet子类.
* session :设置JSP的页面中是否可以直接使用session的.默认值是true.(不需要修改.)
* import :设置JSP页面的导入的相应的类.
* import属性是可以出现多次的.
* 不需要导入的包:
* java.lang.*;
* javax.servlet.*;
* javax.servlet.http.*;
* javax.servlet.jsp.*;
* buffer :设置JSP的页面的输出内容一个缓冲区大小.默认值:8kb
* autoFlush :设置JSP的页面的输出内容一个缓冲区如果满了.默认值:true
* contentType :设置JSP的页面由浏览器打开的时候,浏览器采用的默认的字符集.
* pageEncoding :设置JSP的文件保存到本地硬盘及JSP翻译成Servlet保存到硬盘.采用的字符集.
* errorPage :设置JSP的页面出现异常的时候,如何处理(错误页面友好提示)
* isErrorPage :设置JSP的页面出现异常的时候,如何处理(错误页面友好提示)
* 设置isErrorPage=”true”:在源代码中
Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
***** 在企业中开发的时候一般不会使用这两个属性配置错误友好页面.(全局错误页面)
* 在web.xml中配置全局错误友好页面.
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
* isELIgnored :设置JSP页面是否忽略EL表达式.默认值是false.不忽略.(在JSP中可以直接使用EL)
Page指令中的属性:
* import、contentType、pageEncoding
Include指令
标识JSP页面包含那些JSP页面.
语法:<%@ include file=”包含的页面路径”%>
* 页面包含将页面的HTML的结构代码也包含进来.包含时候,被包含的页面不写HTML的结构.
***** 使用JSP的指令的包含:通常将这种包含称为是静态包含.
* 原理:相当于代码copy,最终翻译成一个Servlet来执行.
* file属性:
* 不能是变量: 变量还没有具体的值.
* 不能传递参数:参数是没有任何意义的.
Taglib指令
标识JSP页面使用的标签库.
语法:<%@ taglib uri=”” prefix=””%>
* uri :标签库路径
* prefix :标签库的别名
1.2.5 JSP的内置对象.
JSP的内置对象指的是可以在JSP中直接使用的对象.
JSP中有9个内置对象.
* pageContext、request、session、application、response、page、config、out、exception.
JSP的9个内置对象是什么、对应的类是谁、常用方法有哪些?
JSP内置对象 真身(真实对象)
* pageContext PageContext
* setAttribute(String name,Object obj);
* getAttribute(String name);
* request HttpServletRequest
* setAttribute(String name,Object obj);
* getAttribute(String name);
* getParameter(String name);
...
* session HttpSession
* setAttribute(String name,Object obj);
* getAttribute(String name);
* application ServletContext
* setAttribute(String name,Object obj);
* getAttribute(String name);
* response HttpServletResponse
* sendRedirect(String url);
* getWriter();
* getOutputStream();
* page Object
* wait();
* notify();
* equals();
* config ServletConfig
* getServletName();
* getInitParameter();
...
* out JspWriter
* print();
* println();
* flush();
* exception Throwable
* exception要使用需要在JSP页面中设置isErrorPage=”true”;
* getMessage();
* getCause();
* 学过:request、response、session、application、config、exception
* 没学过:page、pageContext、out
page对象:
page对象是Object的一个实例.
* page代表是jsp页面翻译后的Servlet对象的引用.一般不建议使用.
* Object page = this;
out对象:
out对象和response.getWriter()是不是一个对象?
* 必然不是.
JspWriter ---- out
PrintWriter ---- response.getWriter();
***** 通过案例说明out对象的原理:
* out流的缓冲区的内容 先输出到 response的流的缓冲区中,由response的输出流响应到页面.
pageContext对象:
JSP的四个作用范围:
* Servlet中学了三个域对象.
* ServletContext、HttpSession、HttpServletRequest.
* ServletContext对象:
* 创建和销毁:
* 创建:Tomcat服务器启动的时候.服务器针对每个web项目创建一个属性自身一个ServletContext对象.是一个全局共享对象.
* 销毁:Tomcat服务器关闭的时候.web项目从服务器移除的时候.
* 作用:记录全局东西.网站的访问次数.做聊天室.
* HttpSession对象:
* 创建和销毁:
* 创建:
* 服务器第一次调用getSession()方法的时候会创建.
* 访问html的时候是否创建session?访问jsp的时候会不会创建session?
* 访问html的时候不会创建session.访问jsp的时候会创建!
* 销毁:session三种情况销毁.
* session过期了.默认30分钟.
* 非正常关闭服务器!(销毁 正常关闭:session序列化到硬盘.)
* session.invalidate() 方法时候会销毁session.
* 作用:保存私人产生数据.购物车.登录信息.验证码.
* HttpServletRequest对象:
* 创建和销毁
* 创建:客户端访问一次服务器.
* 访问html的时候会不会创建?访问jsp的时候会不会创建?
* 访问html的时候会创建服务器.访问jsp更会.
* 销毁:当服务器对这个请求做出响应之后.
* 作用:在转发时候保存数据.
* 重定向和转发区别:(面试)
* 1.重定向是两次请求两次响应!转发是一次请求一次响应!
* 2.重定向地址栏会发生变化!转发地址栏不变!
* 3.重定向是定向到任何网站!转发只能项目内的资源!
* 4.重定向的路径需要加/工程名!转发的时候不需要加工程名!
JSP中的四个域对象:
* pageContext :保存的值只能应用于当前的页面!(范围是最小)---PageScope(page范围)
* setAttribute(String name,Object obj);
* getAttribute(String name);
* request :一次请求访问 --- RequestScope(请求范围)
* session :一次会话.--- SessionScope(会话范围)
* application :一个应用.--- ApplicationScope(应用范围)
* pageContext的作用:
* 1.向四个域范围中存取值.
* 2.findAttribute(String name); --- 从小到大的范围去检索值.
* 3.pageContext内置对象获得其他的8个内置对象.(编写框架或者通用性较高代码.)
1.2.6 JSP的动作标签:
语法:
<jsp:动作标签>
* 标签可以替代一段Java代码.
<jsp:forward > :转发.
<jsp:include > :包含.(动态包含.)
* 静态包含和动态包含的区别?
* 静态包含:相当于代码的拷贝.翻译成一个Servlet执行.
* 动态包含:将包含的页面翻译成各自的Servlet.各自的Servlet都会执行.只包含Servlet执行的结果.
<jsp:param >
* 在forward和include中使用.(很少用!转发的时候,request.setAttribute(“name”,”123”))
与JavaBean有关!参见JavaBean部分内容!
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
1.3 JavaBean与内省
1.3.1 什么JavaBean
JavaBean就是一个特定写法的Java类.
* Java类需要有一个无参的构造.
* 属性需要私有化.
* 对私有化的属性提供public方法访问.setXX getXX方法.
* name:对应方法. setName(); getName();
JavaBean作用:封装和处理数据!
JavaBean的属性:
* 由Bean中set和get方法来确定的!!!
1.3.2 使用JSP的动作标签封装数据
<!-- 封装数据 -->
<!-- useBean:使用JavaBean
id :相当于给类起的标识
class:封装数据的Java类的全路径
scope:JSP的四个作用范围
-->
<jsp:useBean id="p" class="cn.itcast.bean1.Person" scope="page"></jsp:useBean>
* useBean标签翻译后代码:
cn.itcast.bean1.Person p = null;
synchronized (_jspx_page_context) {
p = (cn.itcast.bean1.Person) _jspx_page_context.getAttribute("p", PageContext.PAGE_SCOPE);
if (p == null){
p = new cn.itcast.bean1.Person();
_jspx_page_context.setAttribute("p", p, PageContext.PAGE_SCOPE);
}
}
<jsp:setProperty property="name" name="p"/>
<jsp:setProperty property="age" name="p"/>
<jsp:getProperty property="name" name="p"/>
<jsp:getProperty property="age" name="p"/>
***** <jsp:setProperty property="*" name="p"/>
* 号代表表单中的所有的属性.
1.3.3 BeanUtils类库(会用)
BeanUtils的底层用的就是内省!
内省:
* 通过BeanInfo info = Introspector.getBeanInfo(Class clazz);
* 通过PropertyDescriptor[] pds = info.getPropertyDescriptors()
* 遍历所有的属性描述:
* pd.getReadMethod();
* pd.getWriteMethod();
利用内省完成数据的自动封装:
public void populate(Object obj,Map<String,String[]> map) throws Exception{
// 1.获得类信息
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
// 2.通过 类信息 获得 Bean中的所有的属性描述
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
// 3.遍历数组
for (PropertyDescriptor pd : pds) {
// 说明表单的name的属性的值与Bean中属性名称一致.
if(map.containsKey(pd.getName())){
String[] value = map.get(pd.getName());
// 获得对象的set方法.
Method method = pd.getWriteMethod();
method.invoke(obj, value[0]);
}
}
}
BeanUtils:Apache组织提供的对JavaBean数据封装的一个工具类.
* 需要下载BeanUtils需要jar包.
* commons-beanutils-1.8.3.jar
* commons-logging-1.1.1.jar
* 在Servlet中使用:
* BeanUtils.populate(Object obj,Map map);
* 可以将String转成基本数据类型(包装类)
* 如果传递的是一个日期类型:BeanUtils不能完成类型转换 还会出现异常!
* 需要自定义类型转化器:
public class MyDateConvertor implements Converter{
// 从o转到c
// String--->Date
public Object convert(Class c, Object o) {
// Object就是要转换的类型String
String values = (String) o;
// 将String转成Date.
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 将字符串转成日期format(将日期转成字符串) parse(将字符串转成日期);
Date date = null;
try {
date = dateFormat.parse(values);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
* 使用类型转化器:
* 需要在BeanUtils.populate()方法之前使用
ConvertUtils.register(new MyDateConvertor(), Date.class);
今天内容总结
JSP:
* JSP概念:
* JSP运行原理:
* JSP脚本元素:
* JSP的语法:
* JSP的注释:
* JSP的指令:
* page
* include
* taglib
* JSP的内置对象:
* pageContext、request、session、application、response、config、out、page、exception
* JSP的四个域范围:
* PAGE_SCOPE: pageContext
* REQUEST_SCOPE: request
* SESSION_SCOPE: session
* APPLICATION_SCOPE:application
* JSP的动作:
* <jsp:forward>
* <jsp:include>
* <jsp:param>
* <jsp:useBean>
* <jsp:setProperty>
* <jsp:getProperty>
JavaBean和内省:
* 什么是JavaBean.
* 满足了特定格式的Java类.
* 无参的构造
* 属性私有
* 私有属性有public的get和set方法.
* JSP中使用JavaBean
* 内省技术:获得JavaBean中的属性及属性对应的set和get方法.
BeanUtils的使用:
* BeanUtils.populate(Object obj,Map map);
* ConvertUtils.register(Converter c,Class clazz);
1.4 EL表达式
以上是关于jsp 以及javabean内省技术的主要内容,如果未能解决你的问题,请参考以下文章
JAVAWEB开发之Session的追踪创建和销毁JSP具体解释(指令,标签,内置对象,动作即转发和包括)JavaBean及内省技术以及EL表达式获取内容的使用