Struts2 (2) 基础入门

219 阅读4分钟

结果页面配置

全局结果页面

  • (1) result标签配置action方法的返回值到不同的路径里面。
  • (2) 创建两个action,同时继承ActionSupport执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面。
    • 如果多个action,方法里面返回值相同的,到页面也是相同的,这个时候可以使用全局结果页面配置
            <!-- struts.xml -->
	<package name="demo1" extends="struts-default" namespace="/">
		<action name="book" class="com.day2.action.BookAction">
			<result name="success">/hello.jsp
			</result>
		</action>
		<action name="orders" class="com.day2.action.OrdersAction">
			<result name="success">/hello.jsp
			</result>
		</action>
	</package>

            <!-- struts.xml -->
          <!-- 全局结果页面配置 -->
	<package name="demo1" extends="struts-default" namespace="/">
		<global-results>
			<result name="success">/hello.jsp</result>
		</global-results>
	</package>

局部结果页面

            <!-- struts.xml -->
	<package name="demo1" extends="struts-default" namespace="/">
		<action name="book" class="com.day2.action.BookAction">
			<result name="success">/hello.jsp
			</result>
		</action>
	</package>
            <!--  配置全局页面,也配置了局部页面,最终以局部配置为准。 -->
            <!-- struts.xml -->
	<package name="demo1" extends="struts-default" namespace="/">
        	<global-results>
			<result name="success">/hello.jsp</result>
		</global-results>
                
		<action name="book" class="com.day2.action.BookAction">
			<result name="success">/world.jsp
			</result>
		</action>
	</package>

result标签type属性

  • (1) 标签里面除了name属性之外,还有一个属性type属性。
    • type属性:如何到路径里面(转发还是重定向)
  • (2) type属性值。
    • 默认值,做转发操作,值是dispatcher
    • 做重定向操作,值是redirect
  • (3) 上面两个值dispatcherredirect,这两个值一般针对到页面中配置,配置到其他action里面。
    • chain:转发到action,一般不用,缓存问题。
    • redirectAction:重定向到action

在action获取表单提交数据

  • 概念: 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParametergetParameterMap
  • 提交表单到action,但是action没有request对象,不能直接使用request对象。

使用ActionContext类获取

  • Map<String,Objcct> gctParamcters(): 返回一个包含所有HttpServletRequest参数信息。
    • (1) 因为方法不是静态的方法,需要创建ActionContext类的对象
    • (2) 这个ActionContext类对象不是new出来的,
  • static ActionContext getContext(): 获取当前线程的ActionContext对象。
  • 具体演示
    • (1) 因为方法不是静态的方法,需要创建ActionContext类的对象
    • (2) 这个ActionContext类对象不是new出来的,
    <form action="${pageContext.request.contextPath }/form1.action"
   	method="post">
   	us.ername : <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>
public class Form1DemoAction extends ActionSupport {

   @Override
   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();

   	// 根据key得到value
   	for (String key : keys) {
   		Object[] obj =  (Object[]) map.get(key);
   		System.out.println(Arrays.toString(obj));
   	}
   	return NONE;
   }
}
 <!-- struts.xml -->
   <package name="demo2" extends="struts-default" namespace="/">
   	<action name="form1" class="com.day2.form.Form1DemoAction">
   	</action>
   </package>

使用ServletActionContext获取

  • static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象。
  • static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象。
  • static ServletContext getServletContext():获取Web应用的servletContext对象。
  • static PageContext getPageContext():获取Web应用的PageContext对象。
  • 1: 具体演示
    • (1) 创建表单,提交表单到action里面。
    • (2)action使用ActionContext获取数据
    <form action="${pageContext.request.contextPath }/form1.action"
   	method="post">
   	us.ername : <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>
public class Form2DemoAction extends ActionSupport {

	@Override
	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;
	}
}
 <!-- struts.xml -->
   <package name="demo3" extends="struts-default" namespace="/">
   	<action name="form1" class="com.day2.form.Form2DemoAction">
   	</action>
   </package>

使用接口注入方式获取(了解)

public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
	private HttpServletRequest request;

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	@Override
	public String execute() throws Exception {
		request.getParameter("");
		return NONE;
	}
}

action操作域对象

// 操作三个域对象
//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("contextname", "contextValue");

public class User {
	private String username;
	private String password;
	private String address;
	//set get tosring
        }	 
public class Form4DemoAction extends ActionSupport {

	@Override
	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;
	}
}
	<form action="${pageContext.request.contextPath }/form4.action"
		method="post">
		us.ername : <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>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="form4" class="com.day2.form.Form4DemoAction">
		</action>
	</package>

struts2提供获取表单数据方式

属性封装

  • (1) 直接把表单提交属性封装到action的属性里面
  • (2) 实现步骤
    • action成员变量位置定义变量
      • 变量名称和表单输入项的name属性值一样
    • 生成变量的set方法(把setget方法都写出来)
  • (3) 使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面。
public class DataDemo1Action extends ActionSupport {

	// 1定义变量
	// 变量的名称和表单输入项name属性值一样
	private String username;
	private String password;
	private String address;

	// 2生成变量的set和get方法

	@Override
	public String execute() throws Exception {
		System.out.println(username + " : " + password + " : " + address);
		return NONE;
	}
}
	<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>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="form4" class="com.day2.form.Form4DemoAction">
		</action>
	</package>

模型驱动封装(重点)

  • (1): 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面。
  • (2): 实现步骤
    • 1.action实现接口ModelDriven
    • 2.实现接口里面的方法getModel方法·
      • 把创建对象返回
    • 3.在action里面创建实体类对象
  • (3): 使用模型驱动和属性封装注意问题:
    • 在一个action中,获取表单数据可以属性封装,使用模型驱动封装,不能同时使用属性封装和模型驱动封装获取同一个表单数据
    • 如果同时使用,之后执行模型驱动
public class DataDemo2Action extends ActionSupport implements ModelDriven<User> {

	// 创建对象
	// 前提要求:表单输入项name属性值和实体类属性名称一样
	private User user = new User();

	@Override
	public User getModel() {
		// 返回创建user对象
		return user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return NONE;
	}
}
	<form action="${pageContext.request.contextPath }/data2.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>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="data2" class="com.day2.data.DataDemo2Action">
		</action>
	</package>

表达式封装(会用)

  • (1): 实现步骤
    • 1.使用表达式封装可以把表单数据封装到实体类对象里面
      • 第一步在action里面声明实体类
      • 第二步生成实体类变量的setget方法
      • 第三步在表单输入项的name属性值里面写表达式形式
public class User {
	private String username;
	private String password;
	private String address;
	//set get tosring
        }	 
public class DataDemo3Action extends ActionSupport {

	// 1生成实体类
	private User user;

	// 2生成实体类变量的set和get方法
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return NONE;
	}
}
	<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 /> <input
			type="submit" value="提交" />
	</form>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="data3" class="com.day2.data.DataDemo3Action">
		</action> 
	</package>

扩展-表达式封装和模型驱动比较

  • 1: 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
  • 2: 不同点
    • (1): 使用模型驱动只能把数据封装到一个实体类对象里面
      • 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面。
    • (2): 使用表达式封装可以把数据封装到不同的实体类对象里面

struts2获取数据封装到集合中(会用)

封装到list集合

  • (1): 实现步骤
    • 第一步在action声明List
    • 第二步生成list变量的setget方法
public class User {
   private String username;
   private String password;
   private String address;
   //set get tosring
       }	 
public class ListAction extends ActionSupport {

	//1声明List变量
	private List<User> list;
	
	//生成Set和Get方法。
	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">
		<!-- list[e]:表示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 /> 
		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>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="list" class="com.day2.data.ListAction">
		</action>
	</package>

封装到map集合

  • (1): 实现步骤
    • 第一步在action声明Map集合。
    • 第二步生成setget方法。
    • 第三步在表单输入项的name属性值里面写表达式。
public class User {
   private String username;
   private String password;
   private String address;
   //set get tosring
       }	 

public class MapAction extends ActionSupport {

	//1声明List变量
	private Map<String,User> map;
	
	//生成Set和Get方法。
	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">
	<!--设置key值 map[ ' key值'] -->
		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['two'].username" /> <br /> 
		password : <input type="text" name="map['two'].password" /> <br /> 
		address :<input type="text" name="map['two'].address" /> <br /> 
		<input type="submit"value="提交" />
	</form>
	<package name="demo2" extends="struts-default" namespace="/">
		<action name="map" class="com.day2.data.MapAction">
		</action>
	</package>