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 { 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;)
简单地说,就是以图片的左上角顶点为原点,往下和右都为正,反之为负,