Struts2 -action处理业务请求
struts2与mvc
view层:应用程序输出页面或者界面:jsp、html等
controller层 :Struts2 :1、核心控制器strutsPrepareAndExecuteFiler(通过web.xml配置)
2、业务控制器(action)
model层:应用程序的业务逻辑和业务数据,由封装数据的和处理业务的javabase组成
Action的作用
1、控制业务逻辑:如果业务逻辑很复杂,可以把业务逻辑构建为业务类,在Action中调用业务类
2、返回结果字符集
3、方便的处理数据:比如在Action中以属性方法接受用户数据
Action接受参数的方式一:属性方式(参数字段不是少的时候应用)
<struts> <!-- 设置开发者模式 --> <constant name="struts.devMode" value="true"></constant> <!-- 设置 struts2编码格式--> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="hello" class="action.HelloAction"> <result>/hello.jsp</result> </action> </package> </struts>
taglib标签库
<%@taglib uri="/struts-tags" prefix="s" %> 引用<s:property value="属性名"> 表示引用Action类属性的值
Action接受参数的方式二:JavaBase方式,将模型数据从Action中分离了出来,使Action结构更加清晰
1、定义实体类并,为实体添加属性和setter及getter方法
2、为Action类添加实体属性和setter及getter方法。例如 private User user;
3、修改表单参数name为实体对象名.属性名 。例如:name=“user.username”
4、取值通过<s:property name="实体对象名.属性名"/>的方式。
Action接受参数的方式三:ModeDriven方法(较少用)
1、定义实体类并,为实体添加属性和setter及getter方法
2、创建Action类,实现ModelDriven接口,重写getModel()方法,该方法返回值为实体属性。例如 public User getModel() return user
3、为Action类添加JavaBase类型属性,并需要实例化,不需要setter及getter方法。例如 private User user=new User();
4、form表单项的name属性,以及页面的取值时通过<s:property value="属性名"/>方式,
ModeDriven与前2者区别(三种方式可以混合使用):
相同点:与JavaBase方式定义Action属性的方式类似,与属性方式在jsp页面中的方式相同。
不同点:ModeDriven方式一个Action对应一个Model用于接受参数。而JavaBase方式一个Action可以对应多个Model
ModeDriven方法与属性方式同时存在Action时,对于相同的属性,ModeDriven方式优先被赋值。
在<action>标签中使用method属性调用Action中的指定业务方法
访问Action时,默认调用的execute方法,可以在Action中定义多个业务方法,方法签名要和public String execute()相同,例如 public String add()
可以使用method属性配置指定调用的方法,例如<action method=“add”/〉
一个Action可以配置多个<action>来对应Action中的多个方法,使用不同的name属性值和method属性值配置
例如
<struts> <!-- 设置开发者模式 --> <constant name="struts.devMode" value="true"></constant> <!-- 设置 struts2编码格式--> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 配置多个action对应一个Action中的多个方法 --> <action name="hello" class="action.HelloAction" method="execute"> <result>/hello.jsp</result> </action> <action name="hello2" class="action.HelloAction" method="add"> <result>/success.jsp</result> </action> <action name="hello3" class="action.HelloAction" method="updata"> <result>/success2.jsp</result> </action> </package> </struts>
〈include〉标签:需要配置的〈action〉过多时,可以使用〈include〉标签按照模块包含多个xml配置文件
使struts.xml结构清晰直观,减少各个模块内容的互相干扰,各司其职。
1、按照模块在不同的xml中配置〈action〉
例如 struts_user.XML:
<package.....> <action....></action> </package>
2、在struts.xml中使用〈include〉标签包含多个xml文件
例如:struts.xml:
<include file="struts_user.xml" />
动态方法调用 : 在Action中调用指定业务方法 (有安全隐患,会暴露一些方法给用户)
1、只需要配置一个<action>标签,也不需要使用method属性
2、调用时指出Action名和指定方法:
例如 在form的action=“actionname!methodname”
<!-- 设置 禁用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
使用通配符简化〈action〉配置
用*号匹配到内容替换对应的大括号位置上的内容,一般使用1个*号
<!-- 使用通配符配置action --> <action name="*_*" class="action.{1}Action" method="{1}"> <result>/{1}_{2}.jsp</result> </action>
<!--等价于-->
<action name="user_add" class="action.userAction" method="{add}"> <result>/user_add.jsp</result> </action>
当有多action 匹配时的顺序 :1、优先使用完全匹配,其次才使用通配符。
当有多个通配符匹配时:1、优先写在前面的通配符
默认Action:当访问的Action找不到的时候,会访问默认Action
<default-action-ref name="user" /> ----表示找不到Action时,访问名为user的Action
<action name="user"> <result>/index.jsp</result></action>