都市供求信息网(28)

代码贴士

调用ActionContext类的getParameters()方法将请求中的参数封装到Map对象中,并保存该Map对象。

调用ActionContext类的get()方法获取一个与请求对应的Map对象,并保存该Map对象。

调用ActionContext类的getSession()方法获取一个与会话对应的Map对象,并保存该Map对象。

所以,在用户控制器中,若要对请求或会话存取数据,可使该Action控制器继承相应的接口。例如:

package com.yxq.action;

import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;

import org.apache.struts2.interceptor.ResponseAware;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class s extends ActionSupport implements RequestAware,SessionAware {

private Map request;

private Map session;

public void setRequest(Map request) { //继承RequestAware接口必须实现的方法

this.request=request;

}

public void setSession(Map session) { //继承SessionAware接口必须实现的方法

this.session=session;

}

public String execute() throws Exception {

request.get("userName"); //获取请求中userName属性值

session.put("longer","yxq"); //向会话中存储值

return SUCCESS;

}

}

通过对拦截器中的Map对象进行存取数据的操作,以实现对请求或会话进行存储数据的操作,这将避免用户实现的Action控制器对Servlet API的依赖。

2.模型组件

实际上模型组件概念的范围是很广的,对于实现了MVC体系结构的Struts 2.0框架来说,在模型的设计方面并没有提供太多的帮助。在Java Web应用中,模型通常由JavaBean组成,一种JavaBean被指定用来封装表单数据,实现了视图与控制器之间的数据传递;另一种则实现了具体的业务,称为系统的业务逻辑组件。

在MVC体系结构中,位于控制层的业务控制器负责接收请求,然后调用业务逻辑组件处理请求,最后转发请求到指定视图。所以,真正用来处理请求的是系统中的模型组件。

3.视图组件

在Struts 2.0中,请求处理结束后,返回的视图不仅可以是JSP页面、Action动作,还可以是其他的视图资源,如FreeMarker模板、Velocity模板和XSLT等。

Struts 2.0完成了请求的处理后,将根据在配置文件中的配置,决定返回怎样的视图,这主要通过<result>元素的type属性来决定。若返回FreeMarker模板,则设置type属性的值为freemarker;若返回Velocity模板,则设置为velocity;若返回另外一个Action动作,则设置为redirectAction;在没有设置type属性的情况下,默认返回的视图为JSP页面。例如下面的配置:

<action name="returnType" class="com.yxq.action.ReturnAction">

<result>/welcome.jsp</result> <!-- 返回JSP页面 -->

<result name="vm" type=" velocity ">/welcome.vm </result> <!-- 返回Velocity模板 -->

<result name="action " type=" redirectAction ">myReturn.action</result> <!-- 返回Action动作 -->

</action>

4.配置文件

Struts 2.0会默认加载Web应用WEB-INF/classes目录下的struts.xml配置文件,通过该文件的配置为用户请求指定处理类,并设置该请求处理结束后返回的视图资源。在开发大型项目时,这往往会导致struts.xml文件过于庞大,降低了可读性。此时可以自己创建配置文件,然后在struts.xml文件中通过<include>元素包含这些文件。例如在struts.xml文件中包含名为myxml.xml的文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<include file="myxml.xml"/> <!-- 包含myxml.xml文件 -->

</struts>

在myxml.xml文件中配置用户请求与处理类的关系。例如下面的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name=" example" extends="struts-default">

<action name="my" class="com.yxq.action. MyAction">

<result>/welcome.jsp </result>

</action>

……//其他<action>元素的配置

</package>

</struts>

代码贴士

Struts 2.0配置文件的根元素。

包元素。name属性指定了包名称;extends属性指定了继承的另一个包元素;struts-default是在struts-default.xml文件中定义的包的名称。struts-default.xml位于struts2-core-2.0.11.jar文件下,在该文件的struts-default包元素中,定义了<result>元素的type属性所能指定的视图类型、Struts 2.0中提供的拦截器以及对继承了struts-default包的XML配置文件中配置的所有Action类默认执行的拦截器。

<action>元素,用来配置业务控制器与请求的关系。

<result>元素,指定请求处理结束后返回的视图资源。

5.消息资源文件

在Struts 2.0中,用来存储提示信息的properties资源文件有以下3种:应用范围内的资源文件、包(package)范围内的资源文件和Action类范围内的资源文件。

应用范围内的资源文件。

该资源文件在整个应用内都可以被访问,通常称为全局资源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目录下创建了一个名为allMessage.properties的全局资源文件,在struts.properties文件中需进行如下配置:

struts.custom.i18n.resources=allMessage

若将文件保存在WEB-INF/classes/messages目录下,需进行如下配置:

struts.custom.i18n.resources= messages.allMessage

struts.properties文件通常应被存放到Web应用的WEB-INF/classes目录下,Struts 2.0会自动加载该文件,该文件以key=value的形式存储了一些在Struts 2.0启动时对Web应用进行的配置,key用来表示配置选项名称,value表示配置选项的值,如解决Struts 2.0中文乱码的问题。

包(package)范围内的资源文件。

包范围内的资源文件必须命名为package_xx_XX.properties,其中xx表示语言代码,XX表示地区代码,例如package_zh_CN.properties表示中文(中国)。通过这样命名,可以实现应用程序国际化。也可忽略语言代码与地区代码,命名为package.properties,表示任意语言(地区)。包范围内的资源文件只可被当前包中的类文件访问。例如,存在如图1.60所示的包结构,在actionA子包中存在一个package.properties资源文件,则actionA子包中的类文件可以访问package.properties资源文件,而actionB子包中的类文件则不能访问。可将package.properties文件存放在com/yxq目录下,使得可以访问com/yxq目录下所有子目录中的类文件。

Action类范围内的资源文件。

该资源文件只可被某一个Action类访问,它必须与访问它的Action类存放在同一个目录下,并且文件的命名与该Action类的名称相同。例如,在com.yxq.action包下存在MyAction.java类文件,若在com.yxq.action下创建一个MyAction.properties资源文件,则该文件只可被MyAction.java类文件访问。

1.15 本 章 小 结

本章讲解的是如何应用Struts 2.0开发一个Web项目。通过本章的学习,读者应该对Struts 2.0框架有初步的了解,并能够成功搭建Struts 2.0框架,应用该框架开发一个简单的Web应用程序。

另外,通过阅读本章内容,读者应对一个项目的开发过程有进一步的了解,并要时刻牢记——在进行任何项目的开发之前,一定要做好充分的前期准备,如完善的需求分析、清晰的业务流程、合理的程序结构、简单的数据关系等,这样在后期的程序开发中才会得心应手、有备无患。

下一章

读书导航