Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527344
  • 博文数量: 128
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-22 21:43
文章分类

全部博文(128)

文章存档

2009年(30)

2008年(98)

我的朋友

分类: Java

2008-07-16 08:14:17

现在要接触Java了,用的Web框架有点老,Struts1.1,开发环境为Websphere6.1,服务为5.1 Test
写一些关于Struts学习的笔记吧!

###############
# Servlet组件 #
###############
HttpServletRequest : Servlet容器把HTTP请求信息包存在HttpServletRequest对象中,
                     Servlet组件从request对象中读取用户的请求数据。
                     此外,HttpServletRequest可以存放request范围内的共享数据
HttpServletResponse : 用于生成 HTTP响应结果
HttpSession         : Servet容器为每个HTTP会话创建一个HttpSession实例,HttpSession可以存放session范围的共享数据
ServletContext      : Servlet容器为每个Web应用创建一个ServletContext实例,
                      ServletContext可以存放application范围的共享数据。

HttpServletRequest、HttpSession和ServletContext分别提供了在request、session和application范围内保存和读取共享数据的方法
// save shared data
setAttribute(String key, Object value);
// get shared data
getAttribute(String key);

#############################
# 共享数据在Web应用中的范围 #
#############################
page    : 共享数据的有效范围是用户请求访问的当前JSP网页
request : 共享数据的有效范围为“用户请求访问的当前Web组件,以及和当前Web组件共享同一个用户请求的其他Web组件”。
          如果用户请求访问的是JSP网页,那么该JSP网页的<% @include %>指令及标记包含的其他JSP文件也能访问
          访问共享数据。request范围内的共享数据实际上存放在HttpServletRequest对象中。
session : 共享数据存在于整个HTTP会话的生存周期内,同一个HTTP会话中的Web组件共享它。session范围内的共享数据实际上是
          存放在HttpSession对象中。
application : 共享数据存在于整个Web应用的生命周期内,web应用中所有Web组件都能共享它。
              共享数据实际上存放在ServletContext对象中
                  
                         __...--------....__
                   _,,-''  application      `--._
                ,,'         _,,.......__         `-.
              ,'      _,,-''session     ``-..       `-.
            ,'      .'      _,,.....__       `-.       `.
          ,'      ,'    ,,-'          ``-.      `.       \
         /      ,'    ,'     request      `._     `.      \
        .'     /    ,'       _,....__        \     `.      |
        |     .'    /     ,-'        `.       \     |      |
        |     |    |     /    page     `.     |     |      |
        |      \    \   |               |    .'     /      |
         \     `.    \   \              '   ,'     /      /
          \     `.    `._ `.          ,'  ,'      /      /
           `.     `.     `-.i=-....-=;,,-'      ,'     ,'
             `.     `-.       `'''''        _,-'     ,'
               `-.     ``-..__       ___,,-'      ,,'
                  `--._       `''''''        _,,-'
                       ``--..._______,,..---'

会话拥有特定的生命周期。在以下情况中,会话将结束生命周期,Servlet容器会将HTTP会话所占用的资源释放掉:
● 客户端关闭浏览器
● 会话过期
● 服务器端调用了HttpSession的invalidate()方法

在session范围内保存大量的共享数据,会消耗掉大量的内存资源。如果用户越多,服务器内存就越大
● 运用Java Web容器的Session管理工具,对Session进行持久化管理。如Tomcat提供了管理Session的功能。
● 如果共享数据保存在request范围内也能完成和存放在session范围内同样的功能,则优先考虑保存在request范围内。因为
   HttpServletRequest对象的生命周期比HttpSession对象短得多,当服务器响应完用户请求时,相应的request对象就结束生命周期


############
# JavaBean #
############
// in page scope

// in request scope

// in session scope

// in application scope


如果要将JavaBean的某个属性输出到网页上,可以用


如果要给JavaBean的某个属性赋值,可以用标签,例如:



关于JavaBean:  


#################
# 客户化JSP标签 #
#################
● 标签具有可重用性,因此可以提高开发效率
● 可以在JSP页面以静态或动态的方式客户化设置自定义标签的属性
● 标签可以访问JSP网页中的所有对象,如HttpServletRequest和HttpServletResponse等
● 标签可以相互嵌套,用来完成复杂的逻辑
● 标签可以使JSP页面变得更加简洁,提高可读性。
struts提供的标签库:Bean、HTML、Logic、Nested和Tiles。

JSP标签技术: 或者


###########
# EJB组件 #
###########
EJB组件提供了应用的业务逻辑,但不涉及表示层,不提供用户界面,在Struts框架中,它位于MVC设计模式的模型层。
EJB组件运行在EJB容器中,EJB容器由专门的EJB容器厂商提供。

EJB组件开发技术:


#########################
# Web组件的三种关联关系 #
#########################
● 请求转发
● URL重定向
● 包含
存在以上关联关系的Web组件可以是JSP或Servlet,对于Struts应用,则还包括Action。
这些Web组件都可以访问HttpServletRequest和HttpServletResponse对象,具有处理请求、生成响应结果的功能。

1.请求转发
请求转发允许把请求转发给同一应用程序中的其他Web组件。通常用于Web应用控制层的Servlet流程控制器。
Servlet类使用javax.servlet.RequestDispatcher.forward()方法来转发它所收到的HTTP请求。

如果当前的Servlet组件要把请求转发给一个JSP组件,如hello.jsp,可以在Servlet的service()方法中执行以下代码
RequestDispatcher rd = request.getRequestDispatcher("hello.jsp");
// Forward to requested URL
rd.forward(request, response);

在JSP页面中,可以使用标签来转发请求,例如;

对于请求转发,转发的源组件和目标组件共享request范围内的共享数据。

2.请求重定向
● Web组件可以将请求重定向到任一URL,而不仅仅是同一应用中的URL。
● 重定向的源组件和目标组件之间不共用同一个HttpServletRequest对象,因此不能共享request范围内的共享数据。
如果当前应用的Servlet组件要把请求转发给URL"",
可以在servlet的service()方法中执行以下代码
response.sendRedirect("");

3.包含
包含关系允许一个Web组件聚集来自同一个应用中其他Web组件的输出数据,并使用被聚集的数据来创建响应结果。
这种技术通常用于模板处理器,它可以控制网页的布局。模板中每个页面区域的内容来自不同的URL,从而组成单个页面。
包含关系的源组件和目标组件共用同一个HttpServletRequest对象,因此它们共享request范围内的共享数据。

Servlet类使用javax.servlet.RequestDispatcher.include()方法包含其他的Web组件。例如,
如果当前的Servlet组件包含了三个JSP文件:header.jsp、main.jsp、footer.jsp
则可以在Servlet的service()方法中执行以下代码:
RequestDispatcher rd;
rd = req.getRequestDispatcher("/header.jsp");
rd.include(req, res);
rd = req.getRequestDispatcher("/main.jsp");
rd.include(req.res);
rd = req.getRequestDispatcher("/footer.jsp");
rd.incude(req, res);

在JSP文件中,可以通过指令来包含其他的Web资源,例如:
<% @include file="header.jsp" %>
<% @include file="main.jsp" %>
<% @include file="footer.jsp" %>

#####################
# Struts实现MVC机制 #
#####################
1.视图
视图就是一组JSP文件。这些标签可以是标准的JSP标签或客户化标签,如Struts标签库中的标签。
通常把Struts框架中的ActionForm Bean也划分到视图模块中。ActionForm Bean也是一种JavaBean,除了具有一些JavaBean的常规方法,
还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。Struts框架利用ActionForm Bean来进行视图和
控制器之间表单数据的传递。
...

2.模型

3.控制器
控制器由ActionServlet类和Action类来实现。ActionServlet类是Struts框架中的核心组件。
ActionServlet继承了javax.servlet.http.HttpServlet类。
ActionServlet主要负责接收HTTP请求信息,根据配置文件struts-config.xml的配置信息,把请求转发给适当的Action对象。
如果该Action对象不存在,ActionServlet会先创建这个Action对象。然后调用这个Action实例的execut()方法。
Action的execute()方法返回ActionForward对象,它封装了把用户请求再转发给其他Web组件的信息。

Struts的配置文件struts-config.xml
在内存中每一个元素都对应一个org.apache.struts.action.ActionMapping类的实例


####################
# Struts的工作流程 #
####################
Action映射信息存放在ActionMapping对象中。
当ActionServlet接收到一个客户请求时,将执行如下过程:
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
(3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
(5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先
   创建这个实例,然后调用Action的execute()方法。
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
(7)ActionForward对象指向的JSP组件生成动态网页,反回给客户。
 
阅读(1213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~