几种对数据的处理以及对数据的封装

Java框架

浏览数:93

2019-6-29

AD:资源代下载服务

1、直接获取servletapi

核心类:servletActionContext提供的静态方法

package com.data;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;



/*
 * 数据操作
 */
import com.opensymphony.xwork2.ActionSupport;

public class DataAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		//1、请求数据封装,2、调用servlet处理业务,拿到结果数据集
		
		//3、数据保存到域中
		
		//struts对数据的操作,方式一,直接拿到servletApi,执行操作
		HttpServletRequest request=ServletActionContext.getRequest();
		HttpSession session=request.getSession();
		ServletContext application=request.getServletContext();
		//操作
		request.setAttribute("request_data", "request_data");
		request.setAttribute("session_data", "session_data");
		request.setAttribute("application_data", "application_data");
		
		return SUCCESS;
	}
}

 2、通过ActionContext获取不同的map

(注意:对actionContext的初始化不能再构造方法中执行,因为struts的执行顺序是:先执行Action类的创建,在执行拦截器,拦截器执行完后,在执行action类的业务逻辑方法,会导致数据为空)

package com.data;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;





import com.opensymphony.xwork2.ActionContext;
/*
 * 数据操作
 */
import com.opensymphony.xwork2.ActionSupport;

public class DataAction1 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
	
		/*
		 * 解耦的方式实现对数据的操作
		 */
		ActionContext ac=ActionContext.getContext();
		//得到struts对HttpServletRequest对象进行封装为一个Map对象
		//拿到表示request对象的Map
		Map<String ,Object> request=ac.getContextMap();
		//拿到表示session对象的map
		Map<String , Object> session=ac.getSession();
		//拿到表示ServletContext对象的Map
		Map<String, Object> application=ac.getApplication();
		
		request.put("request_data", "request_data_ActionContext");
		request.put("session_data", "session_data_ActionContext");
		request.put("application_data", "application_data_ActionContext");
		return SUCCESS;
	}
}

 3、实现接口的方法(RequestAware,SessionAware,ApplicationAware)

package com.data;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
/*
 * 数据操作
 */
import com.opensymphony.xwork2.ActionSupport;
/*
 * 方式三:实现接口的方式
 */
public class DataAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;
	
	
	//在struts运行的时候会把代表application的map注入
	@Override
	public void setApplication(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.application=arg0;
	}
	//在struts运行的时候会把代表session的map注入
	@Override
	public void setSession(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.session=arg0;
	}
	//在struts运行的时候会把代表request的map注入
	@Override
	public void setRequest(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.request=arg0;
	}
	
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		//数据
		request.put("request_data", "request_data_Aware");
		request.put("session_data", "session_data_Aware");
		request.put("application_data", "application_data_Aware");
		return SUCCESS;
	}

	
}

 总结:

  第一种是与servlet的耦合度很高,其余两种都是解耦的方式,第二种和第三种的区别不大,如果action中业务方法很多,最好使用第三种,因为获取的request,session和application几乎都会在业务方法中执行的。

对表单提交的数据封装:

1、首先先一个注册页面:

	<form action="${pageContext.request.contextPath }/user_register.action" method="post">
  		用户名:<input type="text" name="user.name"><br/>
  		密码:<input type="text" name="user.pwd"><br/>
  		年龄:<input type="text" name="user.age"><br/>
  		生日:<input type="text" name="user.birth"><br/>
  		
  		<input type="submit" value="注册">
  	</form>

 2、写一个user类

package com.type;

import java.util.Date;

public class User {

	// 封装请求数据
	private String name;  // 必须给set / get可以不用给
	private String pwd;
	private int age;
	private Date birth;
	public void setName(String name) {
		this.name = name;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public String getName() {
		return name;
	}
	public String getPwd() {
		return pwd;
	}
	public int getAge() {
		return age;
	}
	public Date getBirth() {
		return birth;
	}
	
}

 3、在action类中添加setUser()和getUser()方法(若都不写,会报错,因为对于setUser()方法,在jsp页面中使用了user.属性去设置值,而对于getUser()方法不写,则可能会无法接到一些数据,使值为null)

package com.type;

import java.util.Date;

/**
 * Struts核心业务: 请求数据自动封装以及类型转换
 * @author Jie.Yuan
 *
 */
public class UserAction {
	
	 // 对象类型,一定给get方法
	private User user; 
	public void setUser(User user) {
		this.user = user;
	}
	

	// 处理注册请求
	public String register() {
		System.out.println(user.getName());
		System.out.println(user.getPwd());
		System.out.println(user.getAge());
		System.out.println(user.getBirth());
		return "success";
	}
}

 继续去配置struts.xml文件就OK了。可以看到控制台的信息

js练习:格子图片

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>格子图</title>
    <style type="text/css" media="screen">
    * {
        margin: 0;
        padding: 0;
    }
    
    li {
        width: 50px;
        height: 50px;
        background: red;
        position: absolute;
        left: 0;
        top: 0;
        list-style: none;
        background: url(img/1.jpg) no-repeat;
    }
    </style>
</head>

<body>
    <ul id="ulpic"></ul>
    <script type="text/javascript">
    var oUl = document.getElementById('ulpic');
    var str = '';
    for (var i = 0; i < 20; i++) {
        for (var j = 0; j < 38; j++) {
            //background-position属性设置背景图像的起始位置
            str += '<li style="float:letf;left:' + (52 * j) + 'px;top:' + (52 * i) + 'px;background-position:' + (-50 * j) + 'px ' + (-50 * i) + 'px;"></li>';
        }
    }
    oUl.innerHTML = str;
    </script>
</body>

</html>

 效果如图:

background-position:后面有两个属性,第一个是水平位置,第二个是垂直方向的位置,这里需注意的是两个属性的顺序
比如说 
background-position: left -29px;(当中的left指从图片的最左端读起,-29px就是将图片向上移动29px,然后开始读)
再如:background-position: 15px 20px;(指将图片向右移15px,向下移20px;)
简单地说,就是以图片的左上角顶点为原点,往下和右都为正,反之为负,

作者:一盏淡酒、醉了夕阳