Struts2入门
先了解一下MVC模式
MVC时模型视图控制器(Model View Controller),一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑
MVC流程图:
一、Struts2的概念
Struts的概念:是流行和成熟的机遇MVC设计模式的Web应用程序框架。使用Struts的目的是为了帮助我们减少在运用MVC设计模式来开发Web应用的时间。
- 而Struts2并不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证,同时吸收了Struts1和WebWork两者的优势。*
二、Struts2例子
1、搭建Struts2环境
- 下载相关jar包
- 创建项目
- 创建并完善相关配置文件
- 创建Action并测试
下载相关jar包
Apache Struts官方网站
官方网站:struts.apache.org/
struts历史包:people.apache.org/builds/struts/
点击Download,下载第一个就OK
解压之后文档结构
解读一下文档
apps:基于Struts2的示例应用,包含5个war包,可直接部署到服务器上运行。
docs:Struts2的相关文档,各种API
lib:Struts2框架的核心类库、Struts2的第三方插件类库,共90个jar包,为避免臃肿,一般只添加必须包含的类库,可以从Struts2示例blank应用中获取。
src:Struts2框架的全部源代码
不过我用的是MyEclipse,可以很轻松的把包导进去,图来:
然后你就可以看见项目里面多出了些东西
创建项目并完善相关配置文件
在上一步中MyEclipse在web.xml里已经自动将struts2配置完成,在这里就不用再麻烦的配置了
创建Action并测试
创建HelloAction,并继承ActionSupport
Action长这样,重写了excute(执行)Action的方法
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
@Override
public String execute() throws Exception {//执行Action
System.out.println("HelloAction执行");
return SUCCESS;//返回执行的界面
}
}
同时在struts.xml里面添加映射(具体配置在下面)
<struts>
<package name="default" namesapce="/" extends="struts-default">
<action name="helloworld" calss="actions.HelloAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
然后部署到服务器运行,运行成功(这张图片有点长)
三、Struts2的工作原理及其结构
Struts2的工作原理及文件结构
(其中FilterDiapatcher被StrutsPrepareAndExecuteFilter替代,StrutsPrepareAndExecuteFilter可以在action执行之前添加自己的Filter)
Struts2的核心文件
- web.xml:任何MVC框架都需要与MVC应用整合,不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts2框架而言,需要加载StrutsPrepareAndExecuteFilter,只要Web应用负责加载StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter将会加载Struts2框架。
- struts.xml:Struts2的核心配置文件,在开发过程中利用率最高,该文件主要负责管理应用中的Action映射,以及Action包含的Result定义。包含了全局属性、用户请求和相应Action之间的对应关系、Action可能用到的参数和返回结果和各种拦截器的配置。
- struts.properties:Struts2框架的全局属性文件,自动加载,该文件包含很多key-value键值对,并且可配置在struts.xml文件中,使用constant元素。
四、深入Struts2
- 访问Servlet API
- Action搜索顺序
- 动态方法调用
- 指定多个配置文件
- 默认Action
- Struts2后缀
- 接受参数
- 处理结果类型
1、访问Servlet API
Struts2提供三种方式访问Servlet API(不包括HttpServletRequest、HttpServletResponse):
1. ActionContext
2. 实现***Aware接口
3. ServletActionContext
2、Action搜索顺序
- 第一步:判断package是否存在,例如:path1/path2/path3
- 第二步:如果包存在,判读action是否存在,如果action不存在则去namespace的package里面寻找action,如果没有,则报错;如果包不存在,检查上一级路径的package是否存在(直到默认namespace),重复第一步,如果没有,则报错
3、动态方法调用(DMI)
用途:为了解决一个Action对应多个请求的处理,以免Action太多
同样调用方式有三种:
- 指定method属性方式
- 感叹号方式
- 通配符方式
指定method属性
例如在Action添加两个方法add、delete
public class HelloAction extends ActionSupport {
public String add() {
System.out.println("HelloAction中add()执行");
return SUCCESS;
}
public String delete() {
System.out.println("HelloAction中delete()执行");
return SUCCESS;
}
@Override
public String execute() throws Exception {//执行Action
System.out.println("HelloAction执行");
return SUCCESS;//返回执行的界面
}
}
在struts.xml里面配置如下:
<struts>
<package name="default" extends="struts-default">
<action name="helloworld" class="actions.HelloAction">
<result>/index.jsp</result>
</action>
<action name="addAction" method="add" class="actions.HelloAction">
<result>/index.jsp</result><!-- 省略了jsp页面,看控制台输出就行了 -->
</action>
<action name="deleteAction" method="delete" class="actions.HelloAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
这种方法也有弊端,方法过多的话会有很大的工作量,看接下来的方法
感叹号方式(不推荐使用)
Action代码如下:
public class HelloAction extends ActionSupport {
public String add() {
System.out.println("HelloAction中add()执行");
return "add";//注意此处返回值
}
public String delete() {
System.out.println("HelloAction中delete()执行");
return "delete";
}
@Override
public String execute() throws Exception {//执行Action
System.out.println("HelloAction执行");
return SUCCESS;//返回执行的界面
}
}
在struts.xml里面配置如下:
<struts>
<package name="default" extends="struts-default">
<action name="helloworld" class="actions.HelloAction">
<result>/index.jsp</result>
<result name="add">/index.jsp</result>
<result name="delete">/index.jsp</result>
</action>
</package>
<!-- 开通常量 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
在调用的时候只需要使用helloworld!add.action即可
通配符方式(建议使用此种方式)
action不变,在struts.xml里面配置如下:
<struts>
<package name="default" extends="struts-default">
<action name="helloworld_*" method="{1}" class="actions.HelloAction">
<result>/index.jsp</result>
<result name="add">/{1}.jsp</result>
<result name="delete">/{1}.jsp</result>
</action>
</package>
<!-- 开通常量 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
调用的时候写helloworld_add.action即可
4、指定多个配置文件
每个模块有自己的配置文件,可根据模块配置文件,以下这种格式:
<include file="helloworld.xml"></include>
<include file="login.xml"></include>
<!--编码问题-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
例如新建helloworld.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><!--注意引入dtd-->
<struts>
<package name="default" extends="struts-default">
<action name="helloworld_*" method="{1}" class="actions.HelloAction">
<result>/index.jsp</result>
<result name="add">/{1}.jsp</result>
<result name="delete">/{1}.jsp</result>
</action>
</package>
</struts>
在struts.xml里面:
<struts>
<include file="helloworld.xml"></include>
<!-- 开通常量 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
</struts>
运行成功:
5、默认Action
当找不到指定的Action的时候,执行默认Action
只需要在struts.xml中配置
<default-action-ref name="error"></default-action-ref>
<action name="error">
<result>/error.jps</result>
</action>
即可
6、Struts2后缀
一旦加上后缀,请路径必须有后缀名
<constant name="struts.action.extension" value="html"></constant>
也可以在struts.properties中配置,多个后缀使用英文“,”隔开
7、接收参数(在action中接收)
- 使用Action参数接收
- 使用Domain Model接收:在bean中不需要实例化,表单中表单项需要指定哪一个对象的属性(user.name)也可以对List等对象赋值
- 使用ModelDriven接收:需要实例化
(不赘述)
8、处理结果类型
<result>/index.jsp</result>
<result name="success">/index.jsp</result>
如果省略了name属性,系统将采用默认的name属性值,默认的name值是success
- SUCCESS:Action正确的执行完成,返回相应的视图,success是name属性的默认值
- NONE:表示Action正确的执行完成,但不返回任何视图
- ERROR:表示Action执行失败
- LOGIN:Action因为没有登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证
- INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图