struts2每日一记2

来源:互联网 发布:java stringbuffer反转 编辑:程序博客网 时间:2024/05/22 04:36

Struts2Action处理多个请求

1. action 接收请求默认调用execute方法,但这已经满足不了我们的需求。通常 我们会把一个业务模块所有的请求定义在一个action类,这就需要action类提供更多的方法处理不同的请求,而不仅仅是一个execute方法;

例如我们想定义一个用户模块的增删查改请求,就可以采取如下方式实现

public class UserAction {

public String saveUser() throws Exception {

System.out.println("添加用户");

return null;

}

public String updateUser() throws Exception {

System.out.println("修改用户");

return null;

}

public String deleteUser() throws Exception {

System.out.println("删除用户");

return null;

}

public String showUser() throws Exception {

System.out.println("查询单个用户信息");

return null;

}

其配置方法如下:

配置方法一:action方法调用

<constant name="struts.action.extension" value="action"></constant>//请求路径的后缀为action 默认值为action,,

<package name="user" namespace="/user" extends="struts-default">

<action name="save" class="com.puckasoft.web.action.UserAction"

method="saveUser">

</action>

<action name="update"

class="com.puckasoft.web.action.UserAction" method="updateUser">

</action>

<action name="delete"

class="com.puckasoft.web.action.UserAction" method="deleteUser">

</action>

<action name="show" class="com.puckasoft.web.action.UserAction"

method="showUser">

</action>

</package>

运行路径路径格式: 包的命名空间/Action的名字/Action类中定义的方法名.后缀名   

   用户添加 /user/save.action

   用户更新 /user/update.action

   用户删除 /user/delete.action

   用户查看 /user/show.acton

 

 

配置方法二:action动态方法调用DMI

<constant name="struts.action.extension" value="action"></constant>

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<package name="user" namespace="/user" extends="struts-default">

<action name="index"

class="com.puckasoft.web.action.UserAction" />

</package>

     

运行路径格式:包的命名空间/Action的名字!Action类中定义的方法名.后缀名

   用户添加 /user/index!saveUser.action

   用户更新 /user/index!updateUser.action

   用户删除 /user/index!deleteUser.action

   用户查看 /user/index!showUser.acton

注:只用设置常量struts.enable.DynamicMethodInvocationtrue才能执行动态调用,它默认是开启的。要禁止使用此配置 ,(原因):虽然提高了开发的效率,但降低了运行的效率,一般情况下运行效率优先级高于开发效率。

配置方法三:使用通配符定义Action

使用通配符,将配置量降到最低。

action元素的name属性中可以使用*通配符,它可以匹配除了/以外的多个连续字符,在action

元素的classmethod属性以及 result元素中可以引用*通配符在访问期间实际匹配的内容

如:请求路径为save.action

*就为save

例如Useraction中调用的方法为saveUser

name=*” class=com.puckasoft.web.action.UserActionmethod={0}User

{0}代表的是的位置

<constant name="struts.action.extension" value="action"></constant>

<package name="user" namespace="/user" extends="struts-default">

<action name="*"

class="com.puckasoft.web.action.UserAction" method="{0}"/>

</package>

运行路径路径格式: 包的命名空间/Action的名字/Action类中定义的方法名.后缀名

   用户添加 /user/save.action

   用户更新 /user/update.action

   用户删除 /user/delete.action

用户查看 /user/show.acton

2.Action 接受参数三种方式

以获得注册表单数据为例

a. 属性驱动FieldDriven

<h4>注册</h4>

<form action="reg.action"  method="post">

用户名<input type="text" value="" name="uname"><br />

密码<input type="password" name="pwd"><br />

确认密码<input type="password" name="pwd2"><br />

电子邮箱<input type="text" value="" name="email"><br />

<input type="checkbox" checked="checked" name="agree" value="true" >是否同意条款<br />

<input type="submit" value="提交">

</form>

public class UserAction {

private String uname;

private String pwd;

private String pwd2;

private String email;

private boolean agree;

//setter /getter 

}

 

b.模型驱动ModelDriven

类似于struts1ActionForm

实现ModelDriven接口中的getModel方法

域模型是由自己手动创建,由Struts2赋值

<h4>注册</h4>

<form action="reg.action"  method="post">

用户名<input type="text" value="" name="uname"><br />

密码<input type="password" name="pwd"><br />

确认密码<input type="password" name="pwd2"><br />

电子邮箱<input type="text" value="" name="email"><br />

<input type="checkbox" checked="checked" name="agree">是否同意条款<br />

<input type="submit" value="提交">

</form>

public class UserAction  implements ModelDriven<UserVo>{

private UserVo userVo=new UserVo();

public UserVo getModel() {

return userVo;

}

   

//setter /getter

}

l

c.域模型DomainModel

<h4>注册</h4>

<form action="reg.action"  method="post">

用户名<input type="text" value="" name="userVo.uname"><br />

密码<input type="password" name="userVo.pwd"><br />

确认密码<input type="password" name="userVo.pwd2"><br />

电子邮箱<input type="text" value="" name="userVo.email"><br />

<input type="checkbox" checked="checked" name="userVo.agree">是否同意条款<br />

<input type="submit" value="提交">

</form>

public class UserAction  {

private UserVo userVo;

   

//setter /getter

}

3.Action 访问Servlet API

a.Map 类型 servlet 对象

通过特定的API

public class AttrAction {

private Map<String,Object>  requestAttrs;

private Map<String,Object>  sessionAttrs;

private Map<String,Object>  applicationAttrs;

public AttrAction() {

requestAttrs=(Map<String, Object>) ActionContext.getContext().get("request");

sessionAttrs=ActionContext.getContext().getSession();

applicationAttrs=ActionContext.getContext().getApplication();

}

}

依赖注入

public class Attr2Action implements RequestAware, SessionAware,

ApplicationAware {

private Map<String, Object> requestAttrs;

private Map<String, Object> sessionAttrs;

private Map<String, Object> applicationAttrs;

public void setRequest(Map<String, Object> requestAttrs) {

this.requestAttrs = requestAttrs;

}

public void setSession(Map<String, Object> sessionAttrs) {

this.sessionAttrs = sessionAttrs;

}

public void setApplication(Map<String, Object> applicationAttrs) {

this.applicationAttrs = applicationAttrs;

}

}

b.拿真实的servlet API对象

通过特定的API

public class ServletAction {

private HttpServletRequest request;

private HttpServletResponse response;

private HttpSession session;

private ServletContext context;

public ServletAction() {

request = ServletActionContext.getRequest();

response = ServletActionContext.getResponse();

session = request.getSession();

context = ServletActionContext.getServletContext();

}

}

依赖注入

public class Servlet2Action implements ServletRequestAware,

ServletResponseAware, ServletContextAware {

private HttpServletRequest request;

private HttpServletResponse response;

private HttpSession session;

private ServletContext context;

public void setServletRequest(HttpServletRequest request) {

this.request = request;

this.session = request.getSession();

}

public void setServletResponse(HttpServletResponse response) {

this.response = response;

}

public void setServletContext(ServletContext servletContext) {

this.context = servletContext;

}

}

4.返回

a.范围结果

全局结果: 将<result/>作为<global-results>的子元素来配置

局部结果: 将<result/>作为<Action>的子元素来配置

如果一个Action里面包含了与全局结果同门的结果,则局部的结果会覆盖全局的结果

b.返回类型

chain 用来处理Action链    

dispatcher  用来转向页面,通常处理JSP    

redirect 重定向到一个URL 

redirectAction 重定向到一个Action

<package name="default" namespace="/" extends="struts-default">

   <action name="a"  >

      <result  type="dispatcher">/index.jsp</result>

   </action>

   

   <action name="b">

      <result  type="redirect">/index.jsp</result>

   </action>

   

   <action name="c">

     <result  type="chain">a</result>

   </action>

   

   <action name="d">

     <result  type="redirectAction">a</result>

   </action>

</packag

 

 

 

原创粉丝点击