一、struts2
1.概述
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts
2的变化很小。
2. 搭建Struts2开发环境
(1)找到开发Struts2应用需要使用到的jar文件.
(2)编写Struts2的配置文件
Struts2默认的配置文件为struts.xml ,该文件需要存放在WEB-INF/classes下,该 文件的配置模版如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
</struts>
注意:此文件在开发的时候是放到src目录下,程序编译后会自动拷贝到WEB-INF/classes目录下。
(3)在web.xml中加入Struts2 MVC框架启动配置
在struts2中,struts框架是通过Filter启动的。他在web.xml中的配置如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 自从Struts 2.1.3以后,下面的FilterDispatcher已经标注为过时
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件
3.动态方法调用
如果Action中存在多个方法时,可以使用!+方法名调用指定方法。
如果不想使用动态方法调用,可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
4.Struts2中常用的结果类型
dispatcher:主要用于返回JSP,HTML等以页面为基础View视图,这个也是Struts2默认的Result类型。在使用dispatcher时,唯一需要指定的,是JSP或者HTML页面的位置,这个位置将被用于定位返回的页面。
注意:用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。location只能是页面,不能是另一个action
redirect:将用户重定向到一个已配置好的URL。
redirectAction:将用户重定向到一个已定义好的action。
chain 用于把相关的几个action连接起来,共同完成一个功能。
二、案例
用户登录:
struts.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="login" namespace="/login" extends="struts-default">//如果某个包没有指定namespace,则该包使用默认的命名空间,默认的命名空间总是""。struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了struts-default才能使用struts2提供的核心功能。 <action name="login" class="bean.LoginAction" method="execute"> <result name="success"> /index.jsp//如果返回success跳转 </result> <result name="error">/error.jsp</result>//如果出现错误跳转到错误界面 </action> </package>//访问struts2中action的URL路径由两部份组成:包的命名空间+action的名称 </struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Struts Blank</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>
LoginAction.java
package bean; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ //private static final long serialVersionUID = 1L; private String name; private String pass; public String execute() throws Exception{ if(this.getName().equals("scott")&&this.getPass().equals("tiger")){ ActionContext.getContext().getSession().put("user",this.getName()); return this.SUCCESS; } this.addActionMessage("用戶名或密码错误"); return this.ERROR; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }