web开发中的四个域

范围由小到大: pagejsp有效) request(一次请求) session(一次会话) application(当前web应用)

page : PageContext对象

request : request对象  HttpServletRequest

session : session对象  HttpSession

application ServletContext对象

 

共同特点:

四个对象都内置了map集合,可以存储数据,key都是String类型,value都是Object类型

Map<String, Object>

针对map的操作提供了方法:

 setAttribute(String name, Object value)  向域中添加属性

Object getAttribute(String name)     用指定key获得属性

removeAttribute(String name)   删除属性

 

1. 4个对象的生命周期?

生命周期就是指对象的创建到销毁的期间

page:  jsp 页面被执行,生命周期开始,jsp 页面执行完毕 ,生命周期结束

request : 用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束

session : 用户打开浏览器访问,调用getSession()创建session(开始)session超时或被声明失效,该对象生命周期结束

application: web应用加载的时候创建(开始), web应用被移除或服务器关闭,对象销毁(结束)

 

 

2. 四个域的作用范围

什么是域?为什么把这4个对象叫做域对象呢?

域: 即范围的意思

web中的域对象,可以存储对象,在作用范围内都可以取到

内部是Map集合的实现 Map<String, Object>

 

class PageContext {

private Map map = new HashMap();

private HttpSession session;

private JspWriter out;

……

}

 

page:  只在当前jsp页面有效

request: 只在当前请求有效, 每次请求分别对应不同的request域对象

// session: 默认情况下,同一个浏览器来访问有效(发送同一个sessionid)

session 只在一次会话中有效,会话结束就无法取到数据了 (特殊情况,发送Cookie)

application 在一个web应用中有效  (只要服务器不关,web应用不移除就可以取数据)

四个域对象的范围由小到大排列依次为: page request session application

 

3. 哪种情况下用哪种域对象。

四个域对象范围 由小到大: page request session application

原则: 四个域对象在选择的时候,能用范围小的绝不用范围大的

page: 数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)

        什么时候需要用map了,就用page

request:数据只是做显示的,看完了就没用了,就存request

        请求转发, Servlet 产生的处理结果(数据) 交给jsp显示,

session 数据给用户看完了,一会还要用,会话结束了就没用了

        用户登陆,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息

        购物车,购物成功了,给用户看购物车,待会随时可以查看购物车

        请求重定向,因为是两次请求,第一次请求的数据,第二次请求还要看

application : 数据给一个用户用完了,别人还要用

           聊天室,聊天记录,需要给所有的用户看

           统计网站在线人数,所有人看到的应该是一个数

 

总结: 需要定义Map不如用page,请求转发Servlet带给jsp的数据存request

    请求重定向带过去的数据存Session,全局的数据存application

 

4. jsp 细节

只有当jsp页面指定的page指令isErrorPagetrue时,才有exception隐式对象

 

Jsp注释:

 

jsp 出错

1 被翻译的Servlet不能编译,语法错,这时会报告是因为jsp中的哪行导致不能编译

2 翻译的Servlet 在运行期间出现异常, 报告是jsp的哪行导致的异常

    此时会进一步报告导致异常的原因,在Servlet中的哪行出现异常

2. jsp 映射 也是通过servlet 元素

 

5.内省(neixing)

1. javabean

    固定写法的java

    1)必须有无参构造函数

    2)属性必须私有,我们称为字段

    3)提供标准的gettersetter

    例: name 字段 getter: String getName()  settter: void setName(String name)

    特殊的 boolean

 

判断一个javabean是否有 name 属性就取决于是否有settergetter方法

   

   

2. 什么是内省

内省: 通过反射的方式访问javabean

Jdk中的api PropertyDescriptor类操作Bean的属性

 

3.BeanUtils工具包

Apache组织开发了一套用于操作JavaBeanAPI(内省)

核心类 BeanUtils

    setProperty(bean, name, value)

    copyProperties(target, source);

    可以支持String8中基本数据类型转换

    其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)

 

3. WebUtils 工具类

    实现任何request提交的表单封装到对应的javabean

 

 

6.jsp标签

为了移除jsp页面的java代码,sun公司提供了一些内置的标签

我们称为jsp标签,或jsp动作元素

 

1. <jsp:include> 相当于 RequestDispatcher 对象的页面引入

    dispatcher.include  实现 Servlet包含

    dispatcher.forward  实现servlet转发 

    forward 在转发时 web容器会清空response中的数据

    在转发之后就无法向response写入数据

 

    动态引入方式,在程序运行期间引入,jsp被翻译成两个

    include指令也能实现页面的引入,静态引入,将两个jsp翻译成一个Servlet

 

    包含和被包含的jsp页面指令不能发生冲突

    其中,importpageEncoding可以冲突

 

   

 

2. <jsp:forward> 实现请求转发

    结合 <jsp:param> 标签传参,自动进行url编码,编码的方式参照request编码

 

3. <jsp:useBean id class scope> 内省

    反射创建javabean,以id作为key存入指定的域

    其实在创建之前,会先去域中找,找到了则不创建

 

4. <jsp:setProperty> 设置属性值

    <jsp:setProperty name=”user” property=”username” value=”zs” />

<jsp:setProperty name=”user” property=”username” param=”username” />

    <jsp:setProperty name=”user” property=”*” /> 批量

 

5. <jsp:getProperty> 获得属性值

 

7.web开发模式

Sun公司针对web开发提供了两种模式

Model1 jsp+javabean  只适合小型应用

Model2 servlet+jsp+javabean    mvc