结果页面配置:
1、全局结果页面:
》result标签配置action方法的返回值到不同的路径中。
》创建俩个action,执行默认的execute方法,让俩个action的方法都返回相同的success,返回success之后,配置到同一个页面中。
<package name="demo" extends="struts-default" namespace="/"> <action name="ATest" class="cn.test.action.AAction"> <result name="success">/hello.jsp</result> </action> <action name="BTest" class="cn.test.action.BAction"> <result name="success">/hello.jsp</result> </action> </package>
若多个action,方法中的返回值都一样,到的页面也一样,这个时候可以使用全局结果页面配置。
<package name="demo" extends="struts-default" namespace="/"> <!-- 全局结果页面配置 --> <global-result> <result name="success">/hello.jsp</result> </global-result> <action name="ATest" class="cn.test.action.AAction"> </action> <action name="BTest" class="cn.test.action.BAction"> </action> </package>
2、局部结果页面:
<action name="ATest" class="cn.test.action.AAction"> <result name="success">/hello.jsp</result> </action>
同时配置了全局结果和局部结果页面,以局部结果页面为准。
3、result标签type属性:
》在result表中中除了name属性之外,还有一个type属性:如何到路径中(转发/重定向)。
默认转发:转发。值:dispatcher
重定向:值 redirect
俩个属性值一般针对到页面中配置。
若配置到其他的actin中用chain、redirectAction:
chain:转发到action。一般不用,有缓存问题。
redirectAction:重定向到Action。
<action name="ATest" class="cn.test.action.AAction"> <result name="success" type="redirectAction"> BTest </result> </action> <action name="BTest" class="cn.test.action.BAction"> <result name="success">/hello.jsp</result> </action>
在action获取表单提交数据:
1、使用ActionContext类获取:
ActionContext.getContext();获取当前线程的ActionContext对象。
Map<String,Object> getParameters();返回包含HttpServletRequest参数信息。
2、使用ServletActionContext类获取:
static HttpServletRequest getRequest();获取HttpServletRequest对象。
static HttpServletResponse getResponse();获取HttServletResponse对象。
static ServletContext getServletContext();获取ServletContext对象。
static PageContext getPageContext();获取PageContext对象。
3、使用接口注入方式获取:
让action实现接口,为了得到request对象。接口:ServletRequestAware
4、在action中操作域对象:
使用ServletActionContext来操作域对象。
Struts2提供获取表单数据方式:
Action原始的实现方式:
public String execute(){ HttpServletRequest request= ServletActionContext.getRequest(); String str1=request.getParameter("") String str2=request.getParameter("") String str3=request.getParameter("") SelfClass sc=new SelfClass(); sc.setXXX(str1); sc.setXXX(str2); sc.setXXX(str3); return NONE; }
而针对复杂的原始写法,封装了几种方式:属性封装、模型驱动封装、表达式封装。
属性封装:
》可以直接把表单提交数据封装到action的属性中。
》步骤:
a、在action成员变量位置定义变量;变量名称和表单输入项的name属性值保持一致。
b、生成变量的set/get方法:
class TestAction extends ActionSupport{ private String uname; private String pwd; public String getUname(){ return uname; } public void setUname(String uname){ this.uname=uname; } public String getPwd(){ return pwd; } public void setPwd(String pwd){ this.pwd=pwd; } public String execute() throws Exception{ return NONE; } }
》使用属性封装获取表单数据到属性中,不能把数据直接封装到实体类对象中。
模型驱动封装:
》使用模型驱动方式,可以直接把表单数据直接封装到实体类对象中。
》实现步骤:action实现接口 ModelDriven;实现接口中的getModel()方法把创建对象返回;在action中创建实体类对象。
class TestAction extends ActionSupport implements ModelDriven{ private User user=new User(); public User getModel(){ return user; } public String execute() throws Exception{ return NONE; } }
使用模型驱动封装的前提要求:表单输入项name属性值和实体类属性名称保持一致。
》使用模型驱动和属性封装注意问题:
在一个action中,获取表单数据可以使用属性封装或模型驱动封装。两者不能同时使用来获取同一个表单数据。若同时使用,只会执行模型驱动封装。
表达式封装:
使用表达式封装也可以把表单数据封装到实体类对象中。
》在action中声明实体类。并生成实体类变量的get()/set()方法。
》在表单输入项的name属性值中写表达式形式。
class TestAction extends ActionSupport{ private User user; public User getUser(){ return user; } public void setUser(User user){ this.user=user; } public String execute() throws Exception{ return NONE; } }
在表单的name中属性值为:user.uname
<input type="text" name="user.uname" />
》可以把表达式封装归类到属性封装中。
比较表达式封装和模型驱动化封装:
相同点:
使用表达式封装和模型驱动封装都可以把数据封装到实体类中。
不同点:
1、使用模型驱动只能把数据封装到一个实体类对象中。在一个action中不能使用模型驱动把数据封装到不同的实体类对象中。
2、表达式封装可以把数据封装到不同的实体类对象中。
Struts2获取数据封装到集合中:
封装到 list 集合:
class TestAction extends ActionSupport{ private List<User> list; public List<User> getList(){ return list; } public void setList(List<User> list){ this.list=list; } public String execute() throws Exception{ return NONE; } }
封装到 Map 集合:
class TestAction extends ActionSupport{ private Set<String,User> set; public Set<String,User> getSet(){ return set; } public void setSet(Set<String,User> set){ this.set=set; } public String execute() throws Exception{ return NONE; } }