前言
前面Struts博文基本把Struts的配置信息讲解完了…..本博文主要讲解Struts对数据的处理
Action开发的三种方式
在第一次我们写开发步骤的时候,我们写的Action是继承着ActionSupport类的…为啥我们继承了ActionSupport类呢?下面我就会讲解到
继承ActionSupport类
我们来看一下ActionSupport干了什么:
这里写图片描述
也就是说,如果我们在Action类中需要用到Struts为我们提供的数据校验等Struts已经帮我们实现的功能,我们就继承着ActionSupport类..
实现Action接口
我们再来看看Action接口干了什么:
这里写图片描述
当然啦,ActionSuppot也继承着Action接口,所以ActionSuppot拥有Action接口的全部功能….因此,这种开发方式我们是比较少用的…
不继承任何类、不实现任何接口
开发此类的Action,它是不继承任何类、不实现任何接口的…也就是说,它就是一个普通的Java类….
-
Action类
public class PrivilegeAction { public String login() { System.out.println("我是普通的javaAction,不继承任何的类、不实现任何的接口"); return "success"; } }
-
在配置文件中配置:
<struts> <package name="privilige" extends="struts-default"> <action name="login" class="privilegeaction.PrivilegeAction" method="login"> <result name="success">/index.jsp</result> </action> </package> </struts>
-
效果:
这里写图片描述
小总结
-
如果我们使用到了Struts2一些特用的功能,我们就需要继承ActionSupport
-
如果我们没用到Struts2的特殊功能,只要平凡写一个Java类行了。
- 大多情况下,我们还是会继承ActionSupport的。
请求数据封装
一般地,我们使用Servlet的时候都是分为几个步骤的:
-
得到web层的数据、封装数据
-
调用service层的逻辑业务代码
- 将数据保存在域对象中,跳转到对应的JSP页面
现在问题来了,我们自己编写的Action类是没有request、response、Session、application之类的对象的….我们是怎么得到web层的数据、再将数据存到域对象中的呢??
前面已经说过了,Struts预先帮我们完成了对数据封装的功能,它是通过params拦截器来实现数据封装的
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
register.jsp
首先,我们填写表单页面的数据,请求Action处理数据
<form action="${pageContext.request.contextPath}/date01" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="text" name="psd"><br> 年龄:<input type="text" name="age"><br> 生日:<input type="text" name="birthday"><br> <input type="submit" value="注册"><br> </form>
Action封装基本信息
在Action设置与JSP页面相同的属性,并为它们编写setter方法
private String username; private String psd; private int age; private Date birthday; public void setUsername(String username) { this.username = username; } public void setPsd(String psd) { this.psd = psd; } public void setAge(int age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; }
我们直接在业务方法中访问这些变量,看是否能得到表单的值。
这里写图片描述
Action封装对象
一般地,我们注册的时候,都是在Servlet上把基本信息封装到对象上…那么在Struts怎么做呢?
-
创建一个User类,基本的信息和JSP页面是相同的。
package qwer; import java.util.Date; /** * Created by ozc on 2017/4/27. */ public class User { private String username; private String psd; private int age; private Date birthday; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPsd() { return psd; } public void setPsd(String psd) { this.psd = psd; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
- 在Action中定义User对象出来,并给出setter和getter方法….值得注意的是:基本信息只要setter就够了,封装到对象的话,需要setter和getter
public class ccAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String register() { System.out.println(user.getUsername()); System.out.println(user.getPsd()); System.out.println(user.getAge()); System.out.println(user.getBirthday()); return "success"; } }
- 在JSP页面,提交的name要写成
user.username
之类的
<form action="${pageContext.request.contextPath}/register" method="post"> 用户名:<input type="text" name="user.username"><br> 密码:<input type="text" name="user.psd"><br> 年龄:<input type="text" name="user.age"><br> 生日:<input type="text" name="user.birthday"><br> <input type="submit" value="注册"><br> </form>
这里写图片描述