struts-基础内容-5-数据处理,数据回显,模型驱动

来源:互联网 发布:大数据的价值体现在 编辑:程序博客网 时间:2024/06/06 02:24
Struts对数据操作方式一:直接拿到servletAPI,执行操作
 @Override    public String execute() throws Exception {        HttpServletRequest request = ServletActionContext.getRequest();        HttpSession session = request.getSession();        ServletContext application = ServletActionContext.getServletContext();        request.setAttribute("request_data","request_data");        session.setAttribute("session_data","session_data");        application.setAttribute("application_data","application_data");        return SUCCESS;    }
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"        "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="data"  namespace="/" extends="struts-default">        <global-results>            <result name="success">/data.jsp</result>        </global-results>        <action name="data" class="com.cx.Data.DataAction">        </action>    </package></struts>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>data</title></head><body>data<br>${request_data}<br>${session_data}<br>${application_data}</body></html>

方式二:通过ActionContext类-解耦方式-不引入servelt-api

   //方式二        ActionContext ac = ActionContext.getContext();        Map<String , Object> request = ac.getContextMap();        Map<String, Object> session = ac.getSession();        Map<String ,Object> application = ac.getApplication();        request.put("request_data","request_data");        session.put("session_data","session_data");        application.put("application_data","application_data");

方式三:实现接口

package com.cx.Data;import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.interceptor.ApplicationAware;import org.apache.struts2.interceptor.RequestAware;import org.apache.struts2.interceptor.SessionAware;import java.util.Map;/** * Created by cxspace on 16-7-10. */public class DataAction extends ActionSupport implements RequestAware , SessionAware ,ApplicationAware{    private Map<String,Object> request;    private Map<String,Object> application;    private Map<String,Object> session;    /*       1.请求数据封装       2.调用service层处理业务逻辑,拿到结果数据       3.数据保存到域中       Struts对数据操作方式一:直接拿到servletAPI,执行操作     */    @Override    public String execute() throws Exception {        request.put("request_data","request_data-方式三");        session.put("session_data","session_data-方式三");        application.put("application_data","application_data-方式三");        return SUCCESS;    }    @Override    public void setRequest(Map<String, Object> request) {        //struts运行的时候,会把代表request的map对象注入        this.request = request;    }    @Override    public void setApplication(Map<String, Object> application) {        this.application = application;    }    @Override    public void setSession(Map<String, Object> session) {        this.session = session;    }}
总结
方式1:直接
通过ServletActionContext获取servelt-api

方式2:通过ActionContext获取不同的map

方式3:实现接口的方法

方式2 vs 方式3
方式2适合业务方法少的
方式3适合业务方法多的

4. Struts中常用的几个技术

数据回显

数据回显,必须要用struts标签!


 

Action中:

// 进入修改页面

public String viewUpdate() {

// 模拟一个对象(先获取一个id,再根据id调用service查询,把查到的结果保存到域)

User userInfo = new User();

userInfo.setUserName("Jack");

userInfo.setEmail("yuanjie@itcast.cn");

 

ActionContext ac = ActionContext.getContext();

// Map<String,Object> request = (Map<String, Object>) ac.get("request");

// request.put("userInfo", userInfo);

 

/************* 数据回显***************/

// 获取值栈

ValueStack vs = ac.getValueStack();

vs.pop();// 移除栈顶元素

vs.push(userInfo); // 入栈

 

 

// 进入修改页面

return"viewUpdate";

}

 

JSP页面:

<body>

<%@tagliburi="/struts-tags" prefix="s"%>

 

 

<br/>

<!-- 在页面文本框内,显示要修改记录的数据 -->

 

<!-- 手动通过value设置显示的值

<s:form action="#">

 

用户名: <s:textfield name="user.userName" value="%{#request.userInfo.userName}"></s:textfield> <br/>

 

邮箱: <s:textfield name="user.email" value="%{#request.userInfo.email}"></s:textfield> <br/>

</s:form>

-->

 

<!-- 数据回显技术:s:textfield会自动查找根元素数据(Ognl表达式语言取值) -->

<s:formaction="#">

 

用户名: <s:textfieldname="userName"></s:textfield><br/>

 

邮箱: <s:textfieldname="email"></s:textfield><br/>

</s:form>

 

<s:debug></s:debug>

</body>


模型驱动

Struts运行时候,会执行默认的拦截器栈,其中有一个拦截器,模型驱动拦截器:

<interceptor

name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

@Overridepublic String intercept(ActionInvocation invocation) throws Exception {Object action = invocation.getAction();if (action instanceof ModelDriven) {ModelDriven modelDriven = (ModelDriven) action;ValueStack stack = invocation.getStack();Object model = modelDriven.getModel();if (model != null) {stack.push(model);}if (refreshModelBeforeResult) {invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));}}return invocation.invoke();}

引入

prams拦截器,可以把请求数据自动填充的action的属性中举例1:JSP<input type=text name=userName /><input type=text name=pwd />Actionclass UserAction{// 封装请求数据private String userName;private String pwd;//.. set方法}举例2:JSP<input type=text name=user.userName /><input type=text name=user.pwd />Actionclass UserAction{// 封装请求数据private User user;..}举例3:(模型驱动)JSP<input type=text name=userName /><input type=text name=pwd />Actionclass UserAction{// 封装请求数据private User user;..}

步骤及原理

步骤:

1. 实现ModelDriver接口

2. 实现接口方法: 接口方法返回的就是要封装的对象

3. 对象一定要实例化。

分析:
/*** 1. 数据回显* 2. 模型驱动* @author Jie.Yuan**/publicclassUserActionextends ActionSupport implements ModelDriven<User> { // 封装请求数据private User user = new User();
publicvoid setUser(User user) {this.user = user;}public User getUser() {returnuser;}// 实现模型驱动接口方法@Overridepublic User getModel() {return user;}public String add() {// 测试: 使用了模型驱动,是否数据正常? OkSystem.out.println(user);return"success";}

  

 

 

 
0 0
原创粉丝点击