0 序... 2
0.1猜想... 2
0.2 HTTP,HTML,User Agents. 2
0.3 HTTP 请求/响应周期... 2
0.4 Java语言和应用框架... 2
0.5 JavaBeans. 2
0.6属性文件和资源绑定... 3
0.7 JavaServlet 3
1介绍... 5
1.1Struts的历史... 5
1.2 MVC模式... 6
1.3 Struts控制流程... 7
2 创建模型组件... 8
2.1概述... 8
2.2 JavaBean和作用域... 8
2.3 ActionForm Bean. 9
2.4系统状态Bean. 9
2.5商业逻辑Bean. 9
3 创建视图组件... 9
3.1 概述... 9
3.2 国际化信息... 9
3.3Forms 和 FormBeans的交互... 11
3.4 其他表示层技术... 13
4 创建控制(Controller)组件... 15
4.1 概述... 15
4.2 ActionServlet 15
4.3 ActionForm类... 16
4.4 Action类... 19
4.5 异常处理器... 20
4.6 插件类... 20
4.7 ActionMapping的实现... 20
4.8 编写Action Mappings. 21
4.9 在页面中使用ActionMapping. 22
4.10 在ActionMapping中使用通配符... 22
4.11 公共的Log 接口... 23
5. 配置应用... 23
5.1 概述... 23
5.2 Struts配置文件... 23
5.3 为应用配置模块... 25
5.4 WEB应用部署描述符... 25
0 序
0.1猜想
本手册适合于有创建Java Web 应用经验的Web 开发人员.在开始学习Struts之前你应该了解如下的技术:
1. HTTP,HTML,User Agents
2. HTTP 请求/响应生命周期
3. Java语言和应用框架
4. JavaBeans
5. 属性文件和资源绑定
6. Java Servlets
7. Java Server Pages ,JSP Tag Librariy
8. XML
0.2 HTTP,HTML,User Agents
WWW是基于超文本传输协议和超文本标识语言建立的.
用户代理,比如浏览器,他们使用HTTP去请求一个文档然后格式化显示.
0.3 HTTP 请求/响应周期
对于Web开发者来说,理解HTTP的请求和响应周期是很重要的.你要使用HTTP发送一个请求,然后服务器给你一个响应.当你创建WEB应用时,你需要返回一个响应对象来回应请求.
0.4 Java语言和应用框架
Struts是用JAVA编写的.JAVA是面向对象的语言,而Struts充分利用了面向对象的技术.除此而外JAVA支持线程.如果你很好的掌握了JAVA,特别是面向对象编程和线程,这将会有益于最有效的使用Struts和这个手册.
0.5 JavaBeans
象大多数JAVA应用一样,大多数Struts对象都是JavaBean.遵循JavaBean设计模式使得Struts更容易被开发者和JAVA开发工具使用.尽管JavaBean的最初是用来开发可视元素的,但它对开发可重用组件也非常有益.
0.5.1反射和内省
反射是决定什么样的函数或域存在某对象中的方法.内省是反射的特殊形式.
使用内省就可以知道哪些方法将会被其他对象使用(如getter,setter)
Struts框架使用内省来转换HTTP参数到JAVABEAN的属性中和把JAVABEAN中的属性数据组装到HTML的域.
0.5.2 MAP
JAVABEAN把数据存在属性中.JAVABEAN虽然是灵活而功能强的对象,但它并不是编程者存储数据的唯一对象.另一个熟为人知的对象是java.util.Map.Map它是一个名字/值对的数据集合,它经常用来存储动态数据.
0.5.3 DynaBeans
DynaBeans集成了JAVABEAN 的扩展性和MAP的灵活性.编写JAVABEAN要创建一个新类,并且要为每个属性编写方法.DynaBeans则将属性放在XML中配置.
在Struts应用中,你可以使用DynaBeans来描述你的HTML Form,这个策略可以避免编写普通的JAVABEAN来存储很简单的属性.
0.6属性文件和资源绑定
JAVA应用包括WEB应用的配置经常使用属性文件来完成. Struts的消息资源都是通过资源绑定和属性文件实现的.
JAVA资源绑定使用一个或多个属性文件来实现应用的国际化.
0.7 JavaServlet
由于JAVA是面向对象的语言,因此JAVA平台已经将HTTP转换成对象的形式.这将会使JAVA 程序员关注于应用本身而不是HTTP.
HTTP提供了一个标准的机制来扩展服务器的功能,我们称之为CGI. 服务器将请求发送到CGI程序,CGI程序则返回一个响应.同样的任何JAVA服务器则会接收请求,然后转发到Servlet.
Servelt 是javax.servlet.http.HttpServlet的子类,每个Servlet必须完成四个方法:
* public void init(ServletConfig config)
* public void doGet(HttpServletRequest request, HttpServletResponse response)
* public void doPost(HttpServletRequest request, HttpServletResponse response)
* public void destroy()
Struts提供了一个可用的Servlet--org.apache.struts.action.ActionServlet.
作为一个Struts开发者,你只需要编写对象供ActionServlet调用就行了.但是,理解Servlet并熟悉他在JAVA WEB应用中扮演的角色那是最好不过了.
0.7.1 Servlets 和多线程
为了提高性能,Servlet设计程多线程.每个Servlet仅创建一个实例,每一个请求都传递到同一个对象.这将有利于Servlet容器充分的利用资源.因此doGet,doPos在编程时必须保证他是线程安全的.
0.7.2 Servlet Context
ServletContext(javax.servlet.ServletContext)定义了Web 应用中Servlet的视图.在Servlet中通过getServletConfig()可以访问得到,在JSP中则通过隐式对象application得到.ServletContext提供了几个对于创建Struts应用来说非常有用的几个方法:
1.访问WEB应用资源 Servlet通过getResource(),getResourceAsStream()可以访问WEB应用中的静态资源文件.
2.Servlet Context属性 Servlet上下文可以存储JAVA对象到属性中.这些属性对整个WEB应用都可见.
0.7.3 Servlet请求
Servlet请求就是javax.servlet.http.HttpServletRequest,通过它可以访问HTTP请求的所有信息:
1. Cookies 通过getCookies()可以得到当前请求的所有cookie
2. HTTP头 HTTP请求的头可以通过对应的名字来访问.你当然可以通过枚举来列出所有的头.
3. 参数 你可以通过参数来访问HTTP请求的URL的参数或表单中的内容.
4. 请求特性 HTTP请求表单的提交方式(GET/POST),用的是什么协议(HTTP/HTTPS)
5. 请求URI信息 通过getRequestURI()可以得到最初的请求URI,除此之外,我们还可以得到contextPath,servletPath,pathInfo
6. 用户信息 如果你正使用容器来进行安全管理,你可以得到一个Principal对象来代表当前用户,并确认该用户是否拥有某叫角色的权限.
Servlet请求拥有请求级别的属性,与前面提到的应用级别属性类似.请求级别的属性经常用来传递状态信息到可视化组件(如JSP).
Servlet容器保证被Servlet处理的请求处于单线程内.因此你不必担心在访问request对象的属性时会有多线程的问题.
0.7.4 Servlet响应
Servlet的功能就是接收请求,然后生成相应的响应. 这是通过调用javax.servlet.http.HttpServletResponse的方法实现的.
1.设置头 你可以设置包含在响应中的头.最重要的头就是Content-Type,它用来告诉客户端内容的格式,比如:text/html代表html,text/xml代表XML
2.设置Cookies 你可以加入cookie到当前的响应中
3.发送错误响应 你可以使用sendError()发送一个HTTP错误编号
4.重定向到其他资源 你可以使用sendRedirect()定向到另外一个URL
使用Response API的一个最重要的原则就是:操作Header,Cookie的任何方法必须在第一次输出缓冲区满且发送到客户端前调用.
0.7.5过滤
如果你的Servlet容器是基于Servlet规范2.3或更高,那么你就可以使用javax.servlet.Filter来对请求和响应作些处理.许多filter聚合在一起,每一个filter都有机会来对请求和响应做处理.
Struts1.0,1.1,1.2只需要Servlet规范2.2,因此这些版本的Struts并不支持filter.
Struts从1.3开始就需要Servlet规范2.3的容器了.
0.7.6 Session
HTTP的一个关键特性就是无状态,因此我们不知道某个请求是否是来自同一用户的请求,这将会使跨请求的会话变得很艰难.
为了解决这个问题,Servelet实现了一个javax.servlet.http.HttpSession.Servlet容器将采用Cookie或URL Rewriting来保证接邻近的请求包含session id来标识该请求是同一个session.因此保存在session中的属性可以被多个请求共享.
为了不浪费资源,Session有一个可配置的超时时间设置.如果两个请求间的时间差超过了超时时间间隔,那么session中的数据会失效.你可以定义一个默认的超时时