jsp 以及javabean内省技术

时间:2022-12-15 19:56:49

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内省技术的更多相关文章

  1. JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用

    Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...

  2. javabean以及内省技术详解(转)

    一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...

  3. javabean的内省技术和BeanUtils的使用

    一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...

  4. JSP&plus;JavaBean&plus;Servlet技术(MVC模型)

    一,Servlet开发用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种 ...

  5. javabean内省

    何为JavaBean? JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共 ...

  6. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

  7. JSP中使用的模式——JSP&plus;Servlet&plus;JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  8. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  9. JSP基础--javaBean

    JavaBean 1 JavaBean概述 1.1 什么是JavaBean JavaBean是一种规范,也就是对类的要求.它要求Java类的成员变量提供getter/setter方法,这样的成员变量被 ...

随机推荐

  1. geeksforgeeks&commat; Equal to product &lpar;Binary Search&rpar;

    http://www.practice.geeksforgeeks.org/problem-page.php?pid=667 Equal to product Given an array of in ...

  2. How to&colon; Add Missing ContentPlaceHolder

    In Microsoft SharePoint Server 2010, the BlueBand master page is not supported in the Search Center ...

  3. js简单排序

    简单的排序功能 HTML代码: <body> <input id="btn1" type="button" value="排序&qu ...

  4. lucene3&period;6笔记添加搜索功能

    lucene为程序添加搜索功能,此功能基于已创建好的文档的索引之上.这里我已经为一些文档建立了索引,并保存到硬盘上.下面开始针对这些索引,添加搜索功能. 1.简单的TermQuery搜索 Java代码 ...

  5. Div&period;2 C&period; Dasha and Password

    C. Dasha and Password time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  6. cp 命令详解

    作用:  cp 指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录下, 若同时指定多个文件或目录, 而最后的目的 ...

  7. TOMCAT下的JNDI的配置

    一.第一种配置局部JNDI 1.在tomcat的conf目录下的server.xml的<host>标签内,添加: <Context path="/TestMvcMode&q ...

  8. 03-案例——多任务版TCP服务端程序开发

    案例——多任务版TCP服务端程序开发   1. 需求     目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...

  9. hibernate09--连接查询

    创建实体类 package cn.bdqn.bean; import java.util.ArrayList; import java.util.Date; import java.util.List ...

  10. &period;NET Core 管道过滤器扩展

    if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseEx ...