前言
Struts要是用一句话来表述的话,我认为Struts2就是使用Filter作为控制器的MVC。(对于Filter可以参见http://blog.csdn.net/megustas_jjc/article/details/53893489,MVC模式可以参见http://blog.csdn.net/megustas_jjc/article/details/53535116)
struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码。
过去,我们用jsp和servlet搭配,实现展现时,大体的过程是:
1 jsp触发action
2 servlet接受action,交给后台class处理
3 后台class跳转到其他的jsp,实现数据展现
现在有了struts2,实现过程变为
1 jsp出发action
2 struts2拦截请求,调用后台action
3 action返回结果,由不同的jsp展现数据
struts2的安装配置及HelloWorld示例
1.下载struts2:http://struts.apache.org/,选择一个版本下载即可
2.创建一个web项目,其目录如下:
3.配置struts2环境
- 加入 jar 包: 复制 struts\apps\struts2-blank\WEB-INF\lib (struts2提供的一个标准空项目)下的所有 jar 包到当前 web 应用的 lib 目录下.
- 加入 jar 包: 复制 struts\apps\struts2-blank\WEB-INF\lib 下的所有 jar 包到当前 web 应用的 lib 目录下.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- Struts2配置 -->
<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>
</web-app>
- 在当前 web 应用的 classpath 下添加 struts2 的配置文件 struts.xml: 复制 struts1\apps\struts2-blank\WEB-INF\classes 下的 struts.xml 文件到当前 web 应用的 src 目录下. 创建struts.xml文件,配置strust2要调用的action:
<?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="struts2" extends="struts-default">
<action name="HelloWorld" class="tutorial.HelloWorld">
<result>/HelloWorld.jsp</result>
</action>
</package>
</struts>
- package:包,struts使用package来组织模块,作用类似于Java包的机制,用于分门别类的一个工具,. 一个典型的 struts.xml 文件可以有一个或多个包
- name属性: 必须要有的,用于其他的包引用当前包
- extends:当前包继承哪个包,继承的,即可以继承其中的所有配置,通常情况下继承strutrs-default:这个包在struts-defalut.xml文件中定义(在struts2-core的jar包中的struts-default.xml文件中找到这个包)
- action元素对应与你的表单,例如你的表单的action=”HelloWorld”,那么该表单提交后就会将参数交予action的name=”HelloWorld”的实现类处理,此处也可以指定action属性的class及方法:
由input.jsp页面的action:product-save.action到Product对象(com.megustas.struts.helloworld类的一个对象)的save方法再到/WEB-INF/pages/details.jsp
<action name="product-save" class="com.megustas.struts.helloworld" method="save">
<result name="details">
/WEB-INF/pages/details.jsp
</result>
</action>
save方法:
public String save(){
System.out.println("save"+this);
return "details";//与result的name属性details对应
}
对此更直观的理解,可以参考如下对一个登录功能实现的关系图:
- result 元素的 name 属性建立 和 Action 方法返回值之间的映射关系。
补充:”http://struts.apache.org/dtds/struts-2.3.dtd“为添加DTD约束
4.写action类(HelloWorld.java)
这个类主要用于struts2跳转到这个action后。默认执行execute()方法(因为此处没有指定method,也可以像上面补充的示例中指定method)。并根据结果返回字符,然后struts.xml根据返回的字符跳到相应的页面:
public class HelloWorld extends ActionSupport
{
public final static String MESSAGE = "Struts2 is up and running ...";
private String message;
/**
* @return the message
*/
public String getMessage()
{
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message)
{
this.message = message;
}
public String execute() throws Exception
{
setMessage(MESSAGE);
return SUCCESS; // 映射到result的name属性,跳转到对应界面,例如一个登录系统,可以通过if语句进行判断,根据情况返回SUCCESS或ERROR来跳转到不同的页面
}
}
7.编写jsp页面(HelloWorld.jsp)
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="message" /></h2>
</body>
</html>
在Tomcat中运行该项目,然后打开浏览器,在地址栏中输入:http://localhost:8080/Struts2Demo/HelloWorld,结果:
基础示例上的扩展
<struts>
<package name= "hello world" namespace= "/megustas" extends="struts-default" >
<action name="product-input">
<result>/WEB-INF/pages/input.jsp</result>
</action>
<action name="product-save" class="com.megustas.struts.helloworld" method="save">
<result name="details" type="dispatcher">
/WEB-INF/pages/details.jsp<
/result>
</action>
</struts>
namespace:namespace 属性是可选的, 如果它没有给出, 则以 “/” 为默认值. 若 namespace 有一个非默认值, 则要想调用这个包里的Action, 就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里,即变为
http://localhost:8080/contextPath/namespace/actionName.action,需要加入namespace。
type:转发方式(默认值是dispatcher),才能传递参数,result 元素的 type 属性负责指定结果类型. type 属性的值必须是在包含当前包或者是当前包的父包里注册过的结果类型. type 属性的默认值为 dispatcher