Struts学习笔记——第二天

一、结果页面配置

全局结果页面

1.result标签配置action方法的返回值到不同的路径

2.创建两个action,执行默认的execute方法,让两个方法都返回success,返回success后,跳转到同一个页面

<package name="demo1" extends="struts-default" namespace="/">
	<action name="book" class="cn.itcast.action.BookAction">
		<result name="success">/hello.jsp</result>
	</action>
	<action name="order" class="cn.itcast.action.OrderAction">
		<result name="success">/hello.jsp</result>
	</action>
</package>

(1)如果多个action方法的返回值相同,跳转到的页面也是相同的,此时可以使用全局结果页面配置

(2)在package标签中使用<global-results>标签

<package name="demo1" extends="struts-default" namespace="/">
	<global-results>
		<result name="success">/hello.jsp</result>
	</global-results>
	<action name="book" class="cn.itcast.action.BookAction">
		<!-- <result name="success">/hello.jsp</result> -->
	</action>
	<action name="order" class="cn.itcast.action.OrderAction">
		<!-- <result name="success">/hello.jsp</result> -->
	</action>
</package>

局部结果页面

1.局部结果页面就是在每个action标签下配置的

<action name="book" class="cn.itcast.action.BookAction">
	<result name="success">/hello.jsp</result> 
</action>

2.全局结果页面和局部结果页面同时配置的情况下,以局部的为准。例如此时,将跳转到world.jsp,而不是hello.jsp

<global-results>
	<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="cn.itcast.action.BookAction">
	<result name="success">/world.jsp</result>
</action>

二、result标签的type属性

1.配置如何到路径中去(转发或重定向)

2.默认值为dispatcher,做转发操作,一次请求,地址栏不变

3.若值为redirect,做重定向操作,两次请求,地址栏改变

4.上面的两个值一般用于跳转到页面中,还可以跳转到其他action中

    -chain:转发到action(一般不用)

    -redirectAction:重定向到action

    当执行book.action时要跳转到order.action,此时result标签的值为order.action的访问名称

<package name="demo1" extends="struts-default" namespace="/">
	<action name="book" class="cn.itcast.action.BookAction">
		<result name="success" type="redirectAction">order</result>
	</action>
	<action name="order" class="cn.itcast.action.OrderAction">
		<result name="success" type="redirect">/hello.jsp</result>
	</action>
</package>

三、action获取表单提交数据

1.使用ActionContext类获取

(1)创建表单,填写并提交数据

<form action="${pageContext.request.contextPath }/form1.action" method="post">
	用户名:<input type="text" name="username"/><br/>
	密码:<input type="text" name="password"/><br/>
	地址:<input type="text" name="address"/><br/>
	<input type="submit" value="提交"/>
</form>

(2)在action方法中创建ActionContext对象获取数据

public String execute() throws Exception {
	//第一种 使用ActionContext类获取
	//1.获取ActionContext对象
	ActionContext context = ActionContext.getContext();
	//2.调用方法得到表单数据
	//key是表单中控件name;value是值,形式为object数组
	Map<String, Object> map = context.getParameters();
	Set<String> keys = map.keySet();
	for (String key : keys) {
		//数组形式是因为输入项可能有复选框情况
		Object[] obj = (Object[])map.get(key);
		System.out.println(Arrays.toString(obj));
	}
	return NONE;
}

2.使用ServletActionContext类获取

 (1)调用类里面静态方法,得到request对象

public String execute() throws Exception {
	//第二种 使用ServletActionContext类获取
	//1.获取request对象
	HttpServletRequest request = ServletActionContext.getRequest();
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	String address = request.getParameter("address");
	System.out.println(username+"-"+password+"-"+address);
        return NONE;
}

3.使用接口注入(了解)

(1)让action实现接口来得到request对象,再使用request对象获取数据

public class Form1Demo3 extends ActionSupport implements ServletRequestAware {
	private HttpServletRequest request;
	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		// TODO Auto-generated method stub
		this.request = arg0;
	}
	
	public String execute() throws Exception {
		//第三种 使用ServletRequestAware接口获取
		//1.使用上面获取的request对象
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String address = request.getParameter("address");
		System.out.println(username+"-"+password+"-"+address);
		return NONE;
	}
}

4.在action操作域对象

   request、session、servletContext 三个域对象

public String execute() throws Exception {
	//1.操作request域对象
	HttpServletRequest request = ServletActionContext.getRequest();
	request.setAttribute("req", "reqValue");
	//2.操作session域
	HttpSession session = request.getSession();
	session.setAttribute("sess", "sessValue");
	//3.操作ServletContext域
	ServletContext context = ServletActionContext.getServletContext();
	context.setAttribute("context", "contextValue");
	return NONE;
}

四、Struts2封装获取表单数据方式

1.原始方法获取表单数据并封装到实体类对象

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(username, password, address);
	System.out.println(user.toString());
	return NONE;
}

2.属性封装

   直接把表单提交属性封装到action的属性里面

(1)在action成员变量位置定义变量,变量名称和表单输入项的name属性值一样

(2)生成变量的get和set方法

(3)这种方法可以把表单数据封装到action类的属性里面,并不能直接封装到实体类对象中

public class DataDemo1 extends ActionSupport{
	//使用属性封装获取表单数据
	//1.定义变量,变量名称需要与表单控件的name属性值一致
	private String username;
	private String password;
	private String address;
	
	//2.生成变量的get和set方法
	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)让action类实现接口ModelDriven

(2)实现接口中的getModel方法,返回创建的对象

(3)这种方法,可以直接把表单数据封装到实体类对象中

public class DataDemo2 extends ActionSupport implements ModelDriven<User>{
	//使用模型驱动封装获取表单数据
	
	//1.创建对象,表单控件name属性值要与实体类属性名称一致
	User user = new User();
	
	//2.返回对象
	public User getModel() {
		return user;
	}

	public String execute() throws Exception{
		System.out.println(user.toString());
		return NONE;
	}

}

4.表达式封装(会用)

(1)在action里面生命实体类

(2)生成实体类对象的get和set方法

(3)在表单输入控件的name属性值里面写表达式形式 类名.属性名

public class DataDemo3 extends ActionSupport{
	//使用表达式封装获取表单数据
	
	//1.声明对象
	private User user;
	//2.生成实体类对象的get和set方法
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
	public String execute() throws Exception{
		System.out.println(user.toString());
		return NONE;
	}

}
<form action="${pageContext.request.contextPath }/data3.action" method="post">
	用户名:<input type="text" name="user.username"/><br/>
	密码:<input type="text" name="user.password"/><br/>
	地址:<input type="text" name="user.address"/><br/>
	<input type="submit" value="提交"/>
</form>

5.模型驱动封装和表达式封装比较

  • 相同点

  (1)都可以把数据封装到实体类对象中

  • 不同点

  (1)在一个action中,模型驱动封装只能把数据封装到一个实体类中

  (2)表达式封装可以把数据封装到不同的实体类中

public class DataDemo4 extends ActionSupport{
	//使用表达式封装获取表单数据
	
	//1.声明对象
	private User user;
	private Book book;
	//2.生成实体类对象的get和set方法
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	//再创建一个book实体类
	public Book getBook() {
		return book;
	}
	public void setBook(Book book) {
		this.book = book;
	}
	public String execute() throws Exception{
		System.out.println(user.toString());
		System.out.println(book.getBname());
		return NONE;
	}

}
<form action="${pageContext.request.contextPath }/data4.action" method="post">
	用户名:<input type="text" name="user.username"/><br/>
	密码:<input type="text" name="user.password"/><br/>
	地址:<input type="text" name="user.address"/><br/>
	书名:<input type="text" name="book.bname"/><br/>
	<input type="submit" value="提交"/>
</form>

五、Struts2获取表单数据封装到集合(会用)

1.List集合

(1)在action声明List

(2)生成List变量的get和set方法

(3)在表单输入项name属性中写表达式

public class ListDemo extends ActionSupport{
	//封装数据到List集合
	//1.声明List变量
	private List<User> list;

	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;
	}
}
<form action="${pageContext.request.contextPath }/list.action" method="post">
	用户名:<input type="text" name="list[0].username"/><br/>
	密码:<input type="text" name="list[0].password"/><br/>
	地址:<input type="text" name="list[0].address"/><br/><br/>
	用户名:<input type="text" name="list[1].username"/><br/>
	密码:<input type="text" name="list[1].password"/><br/>
	地址:<input type="text" name="list[1].address"/><br/>
	<input type="submit" value="提交"/>
</form>

 2.Map集合

public class MapDemo extends ActionSupport{
	//封装数据到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;
	}
}
	<form action="${pageContext.request.contextPath }/map.action" method="post">
		用户名:<input type="text" name="map['one'].username"/><br/>
		密码:<input type="text" name="map['one'].password"/><br/>
		地址:<input type="text" name="map['one'].address"/><br/><br/>
		用户名:<input type="text" name="map['two'].username"/><br/>
		密码:<input type="text" name="map['two'].password"/><br/>
		地址:<input type="text" name="map['two'].address"/><br/>
		<input type="submit" value="提交"/>
	</form>

猜你喜欢

转载自blog.csdn.net/weufengwangshi_/article/details/87902494
今日推荐