Struts2(2)
一、分模块开发:单独写模块的配置文件,把配置文件引入到核心配置文件中
Aaction的单独配置文件如下
<?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="hellodemo" extends="struts-default" namespace="/"> <!-- name: 访问名称 --> <action name="hello" class="cn.itcast.action.HelloAction"> <!-- 配置方法的返回值到页面 --> <result name="ok">/hello.jsp</result> </action> </package> </struts>
把单独配置文件引入核心配置文件中
<?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> <!-- 引入hello.xml文件 使用include标签 file属性:单独配置文件的全路径 --> <include file="cn/action/hello.xml"></include> </struts>
二、访问action的三种方式
方式1:通过action中的method属性访问
1、在action中创建多个方法
2、使用method标签配置
方式2:通过通配符的方式访问
1、在action标签里面name属性,name属性值里面写 符号 * 星号
* 理解: 表示匹配任意内容
- 比如访问hello,* 可以匹配到
- 比如访问add,* 可以匹配到
method属性值为“*”的值。建议固定写{1},表示一个“*”号
方式3:动态访问实现(不用)
详细配置如下
<?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> <!-- 配置action的方法访问 --> <!-- <package name="methoddemo" extends="struts-default" namespace="/"> 有method属性:写要执行的action里面的方法的名称 <action name="addAction" class="cn.itcast.method.BookAction" method="add"></action> 执行update方法 <action name="updateAction" class="cn.itcast.method.BookAction" method="update"></action> </package> --> <!-- 通配符方式实现 --> <package name="methoddemo" extends="struts-default" namespace="/"> <!-- name属性值里面写符号 * (1)执行action里面的add方法,访问 book_add,使用book_*可以匹配到,*相当于变成 add (2)执行action里面的update方法,访问book_update,使用book_*可以匹配到,*相当于变成 update 上面两个路径使用 book_* 可以匹配到 method属性写*值,几{1} 固定写法 --> <action name="book_*" class="cn.itcast.method.BookAction" method="{1}"> </action> </package> </struts>
三、action获取表单数据(3种方式)
1、使用ActionContext类
1、创建表单
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/data1.action" method="post"> username:<input type="text" name="username"/> <br/> password:<input type="text" name="password"/> <br/> address:<input type="text" name="address"/> <br/> <input type="submit" value="提交"/> </form> </body> </html>
2、在action中使用ActionContext获取数据
public class Form1DemoAction extends ActionSupport { public String execute() throws Exception { //第一种方式 使用ActionContext类获取 //1 获取ActionContext对象 ActionContext context = ActionContext.getContext(); //2 调用方法得到表单数据 // key是表单输入项name属性值,value是输入的值 Map<String, Object> map = context.getParameters(); Set<String> keys = map.keySet(); for (String key : keys) { //根据key得到value //数组形式:因为输入项里面可能有复选框情况 Object[] obj = (Object[]) map.get(key); System.out.println(Arrays.toString(obj)); } return NONE; } }
2、使用ServletActionContext类获取
public class Form2DemoAction extends ActionSupport { public String execute() throws Exception { //第一种方式 使用ServletActionContext类获取 //1 使用ServletActionContext获取request对象 HttpServletRequest request = ServletActionContext.getRequest(); //2 调用request里面的方法得到结果 String username = request.getParameter("username"); String password = request.getParameter("password"); String address = request.getParameter("address"); System.out.println(username+":"+password+":"+address); return NONE; } }
3、使用接口注入方式(了解):让action实现接口,为了得到request对象
public class Form3DemoAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request ; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } public String execute() throws Exception { request.getParameter(""); return NONE; } }
四、Struts封装获取的表单数据(4种方式)
1、使用最原始的方式将获取的数据封装到实体类对象中
1、创建实体类
public class User { private String username; private String password; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", address=" + address + "]"; } }
2封装数据
public class Form4DemoAction extends ActionSupport { public String execute() throws Exception { //1 获取表单数据 HttpServletRequest request = ServletActionContext.getRequest(); String username = request.getParameter("username"); String password = request.getParameter("password"); String address = request.getParameter("address"); //2 封装到实体类对象里面 User user = new User(); user.setUsername(username); user.setPassword(password); user.setAddress(address); System.out.println(user); return NONE; } }
2、属性封装:直接把表单数据提交,封装到cation的属性里面
注意:使用属性封装获取表单数据封装到属性里面,不能把数据直接封装到实体类对象里
步骤:1、在action成员变量位置定义属性(变量)
变量名称和表单输入项的name属性值一样
2、生成属性的set方法(记不住是get还是set,建议都写出来)
public class DataDemo1Action extends ActionSupport { //1 定义变量 //变量的名称和表单输入项name属性值一样 private String username; private String password; private String address; //2 生成变量的set和get方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String execute() throws Exception { System.out.println(username+":"+password+":"+address); return NONE; } }
3、驱动模型封装(重点)
1、使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
2、实现步骤
(1)action实现接口 ModelDriven
(2)实现接口里面的方法 getModel方法
- 把创建对象返回
(3)在action里面创建实体类对象
注意:在一个action中,获取表单数据可以使用属性封装或者使用模型驱动封装,
不能同时使用属性封装和模型驱动封装获取同一个表单数据
如果同时使用,只会执行模型驱动
public class DataDemo2Action extends ActionSupport implements ModelDriven<User>{//泛型直接写实体类的名字 //第3步:创建对象 //前提要求: 表单输入项name属性值 和 实体类属性名称一样 private User user = new User();
//第2步:实现getModel方法 public User getModel() { //返回创建user对象 return user; } @Override public String execute() throws Exception { System.out.println(user); return NONE; }
4、表达式封装(相当于属性封装)
1、使用表达式封装可以把表单数据封装到实体类对象里面
实现步骤:
1、在action里面声明实体类
2、生成实体类变量的set和get方法
3、在表单输入项的name属性值里面写表达式形式
public class DataDemo3Action extends ActionSupport { //1 声明实体类 private User user; private Book book; //2 生成实体类变量的set和get方法 public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { System.out.println(user); System.out.println(book.getBname()); return NONE; }
表单代码:在表单输入项的name属性值里面写表达式形式
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/data3.action" method="post"> username:<input type="text" name="user.username"/> <br/> password:<input type="text" name="user.password"/> <br/> address:<input type="text" name="user.address"/> <br/> bname: <input type="text" name="book.bname"/> <br/> <input type="submit" value="提交"/> </form> </body> </html>
5、表达式封装和模型封装的区别
1 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
2 不同点:
(1)使用模型驱动只能把数据封装到一个实体类对象里面
- 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面
(2)使用表达式封装可以把数据封装到不同的实体类对象里面
五、将数据封装到List集合,可以获取多个封装对象
步骤:
第一步 在action声明List
第二步 生成list变量的set和get方法
第三步 在表单输入项里面写表达式
public class ListAction extends ActionSupport { // 1 声明List变量,可以获取多个用户对象 private List<User> list; // 2 生成get和set方法 public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } @Override public String execute() throws Exception { System.out.println(list); return NONE; } }
表单数据:第三步 在表单输入项里面写表达式
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/list.action" method="post"> <!-- list[0] : 表示list集合中第一个user对象 --> username:<input type="text" name="list[0].username"/> <br/> password:<input type="text" name="list[0].password"/> <br/> address:<input type="text" name="list[0].address"/> <br/><br/> <!-- list[1] : 表示list集合中第二个user对象 --> username:<input type="text" name="list[1].username"/> <br/> password:<input type="text" name="list[1].password"/> <br/> address:<input type="text" name="list[1].address"/> <br/> <input type="submit" value="提交"/> </form> </body> </html>
六、将数据封装到Map集合
步骤:
第一步 声明map集合
第二步 生成get和set方法
第三步 在表单输入项的name属性值里面写表达式
public class MapAction extends ActionSupport { // 1 声明map集合 private Map<String,User> map; public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } @Override public String execute() throws Exception { System.out.println(map); return NONE; } }
表单数据 第三步:在表单输入项的name属性值里面写表达式
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/map.action" method="post"> <!-- 设置key值 map['key值'], 可以任意取名 设置value值 .你想获取的对象的属性值名 --> username:<input type="text" name="map['one'].username"/> <br/> password:<input type="text" name="map['one'].password"/> <br/> address:<input type="text" name="map['one'].address"/> <br/><br/> username:<input type="text" name="map['abcd'].username"/> <br/> password:<input type="text" name="map['abcd'].password"/> <br/> address:<input type="text" name="map['abcd'].address"/> <br/> <input type="submit" value="提交"/> </form> </body> </html>