1.FilterDispatcher作为个标准的filter,配置在Web应用中,负责拦截用户的所有请求。并且还有加载Struts2配置文件的职责。但这里并未告
诉它如何加载Struts2的配置文件,以及Struts2 的配置文件放在哪里及文件名是什么。FilterDispathcher默认加载WEB-INF/classes路径下
的Struts.xml文件。如果需要Struts2的配置文件不在WEB-INF路径下,或者改变了文件名,则应采用如下方式配置
<filter><!--filter的名称-->
<filter-name>Struts2</filter-name>
<!--filter实现类-->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<!--通过init-param配置节重新指定Struts2配置文件的位置-->
<init-param>
<param-name>config</param-name>
<!--指定Struts.xml在WEB-INF目录下-->
<param-value>
struts-default.xml.struts-plugin.xml,../struts-config-user.xml
</param-value>
<!--param-value默认从classes目录下加载,“../”代表的是classes的上级目录,即:web-inf目录-->
</init-param>
</filter>
<!--配置filter的映射部分-->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-param>/*</url-param>
</filter-mapping>
在上面的配置中,指定了Struts2的配置文件Struts-config-user.xml文件,并且该文件位于WEB-INF目录下。该文件作为init-param参数载入,载入时指定了
参数名config。config是Struts2固定的参数名。Struts2负责解析该参数,并加载该参数的指定配置文件。对于以上Struts2配置文件方式,需要注意以下2点:
1》".."表示后退到WEB-INF目录,不能直接写成struts-default.xml,struts-config-user.xml2》 如果设置了<param-name>config</param-name>参数,那么Struts-default.xml等Struts2默认加载的文件也需要指定
2 添加Struts2配置文件并配置Action
Action 是业务逻辑控制器,它负责获取用户提交的请求数据,并调用模型进行数据处理,然后根据处理结果,转发到不同的视图。下面是示例配置代码
<struts>
<!--Struts2的Action都必须配置在package里面-->
<package name="default" extends="struts-default"><!--继承自默认包-->
<!--定义一个login的Action类,实现类为LoginAction-->
<action name="login" class="com.soft.struts51.web.struts.action.LoginAction">
</action>
</package>
</struts>
------------------------------------------------------------------------------------------
属性: package:指定配置Action所在包。Struts2框架使用包来管理Action,每个包就是多个Action引用的集合。配置包时,必须指定
name属性。还可指定一个可选的extends属性,表示继承其他包。Struts2框架的默认包为Struts-default
name:指定Action的名称。FilterDispatcher根据该属性来匹配用户请求的Action
class:用于指定Action的实现类。在配置是需要给出Action类的完整类名,即应该把类的包名含在内
3.配置Result
<result>元素用于把一个逻辑名映射到特定的URL,通过这种方式,Action类或者JSP文件无需指定实际的URL,只要指定逻辑名就能实现请求转发
或者重定向这可以减弱控制组件和视图之间的耦合,并且有助于维护Jsp文件。下面是Result的配置代码:
<!--定义一个login的action类,实现类为LoginAction-->
<action name="login" class="com.soft.struts51.web.struts.action.LoginAction">
<!--定义结果与视图资源的映射关系-->
<result name="success">index.jsp<result>
<result name="error">/fail.jsp</result>
</action>
name:指定该result的逻辑名,与Action的execute返回值对应。该属性为可选,如果省略,Struts2会默认name的属性值为“success”。
type:可选属性。用于指定result结果类型。默认为dispatcher,表示将响应转发到浏览器指定的位置,如果取值为redirect,表示将响应重定向到浏览器指定的位置。
上面的映射文件定义了name为login的Action,即:该Action将负责处理login.Action的请求。该Action将调用自身的execute方法,如果execute方法返回success字符串
,请求将被转发到/index.jsp页面;如果execute方法返回fail字符串,则请求将被转发到/fail.jsp页面。
以上在Action中配置的Result属于局部Result,局部Result只能被该Action引用。全局Result单独配置,所有的Action都可以引用。全局的Result配置在global-results
元素里。下面是配置全局Result代码:
<global-result>
<result name="error">/error/jsp</result>
</global-result>
可以为Web应用程序做一个专用于显示错误信息的页面error.jsp。然后给所有的Action都来共享。在这种情况下,可以把error.jsp配置成全局的Result.
4.跟踪用户状态
上述的Action处理完用户登录后,仅仅执行了简单的页面转发,并未跟踪用户状态信息,通常,当一个用户登录成功后需要将用户信息添加到Session状态信息。为了访问HttpSession实例
,Struts2提供了一个ActionContext类,该类提供了一个getSession方法,但该方法的返回值类型并不是Httpsession,而是Map.实际上,Struts2为了简化Action类的测试,将Action类与
ServletAPI完全分离,但Struts2的系列拦截器会负责Map和httpsession之间的转换。为了可以跟踪会话信息,修改Action类的execute方法,修改后的execute方法代码如下:
public class LoginAciton{
//封装用户请求参数的uid
private String uid;
//封装用户请求的pwd属性
private String pwd;
//处理用户请求的execute方法
public String execute() throws Exception{
UserInfo userinfo=UserService.newInstance().login(this.uid,this.pwd);
if(userInfo!=null)//如果登录成功
{
//添加userinfo信息
ActionContext.getContext().getSession.put("userInfo",userInfo);
//转发到成功页面
return "success";
}
//转发到失败页面
return "fail";
}
...
getter() and setter()方法
...
}
为了检验设置的Session属性是否成功,可修改index.jsp页面。在index.jsp页面中可使用EL(表达式语言)来输出Session中的UserInfo属性。