结果页面配置,局部优先于全局
如果有多个action, 它们的返回值相同、配置的页面也相同,可以使用全局参数
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="dp" extends="struts-default" namespace="/ehome">
<!--<global-allowed-methods>regex:.*</global-allowed-methods>-->
<global-results>
<!--全局结果配置-->
<result name="success">/hello.jsp
</result>
</global-results>
<action name="demo1" class="com.bj169.action.Demo1Action" method="execute">
<!--局部结果配置-->
<!--局部结果配置优先全局结果配置-->
<result name="success">/hello.jsp</result>
</action>
<action name="demo2" class="com.bj169.action.Demo2Action">
</action>
<action name="register" class="com.bj169.action.Register">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
在action中获取表单提交数据
1.使用ActionContext获取(非重点),使用这种方法要熟练对集合的遍历
//通过ActionContext获取表单提交的数据
//通过静态方法获取上下文对象
ActionContext context = ActionContext.getContext();
HttpParameters parameters = context.getParameters();
// 通过getParameters获取参数map集合
Set<Map.Entry<String, Parameter>> entries = parameters.entrySet();
Iterator<Map.Entry<String, Parameter>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Parameter> next = iterator.next();
System.out.println("key" + next.getKey());
Parameter value = next.getValue();
for (String s : value.getMultipleValues()) {
System.out.println("value:" + s);
}
}
2.使用ServletActionContext获取数据
核心: 通过一系列静态方法,包括获取request对象,通过request对象调用getParameter()方法
//获得request对象
HttpServletRequest request = ServletActionContext.getRequest();
//获得session对象
HttpSession session = request.getSession();
//获得servletContext对象
ServletContext servletContext = ServletActionContext.getServletContext();
request.setAttribute("value", "request");
session.setAttribute("value", "session");
servletContext.setAttribute("value", "servletContext");
3.使用接口注入的方式
核心: 实现ServletRequestAware接口
重写setServletRequest方法,一旦被调用,就可以获取request对象
把该对象赋值给Action自己定义的request对象(传递引用)
在action中操作域对象
request、session、servletContext 三种作用域的传值
核心:使用ServletActionContext
//获得request对象
HttpServletRequest request = ServletActionContext.getRequest();
//获得session对象
HttpSession session = request.getSession();
//获得servletContext对象
ServletContext servletContext = ServletActionContext.getServletContext();
request.setAttribute("value", "request");
session.setAttribute("value", "session");
servletContext.setAttribute("value", "servletContext");
return SUCCESS;
在jsp中通过域对象获取数据
<body>
request${requestScope.value}<br>
session${sessionScope.value}<br>
servletContext${applicationScope.value}
</body>
Struts2提供获取表单数据的方式
1.使用request分别获取属性,并调用bean方法(原始)。
2. 属性封装,在action中声明表单项对应的字段,并指定bean方法。就是set()方法
但它仅仅能把值封装到属性中,并不能封装到实体对象中。
3.模型驱动封装(重点)
核心:action实现ModelDriven接口,并重写getModel方法
在action中声明实体类对象并实例化
在getModel方法中返回该实体对象,完成
package com.bj169.action;
import com.bj169.entity.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Arrays;
/**
* @ClassName Register
* @Description TODO
* @Author Administrator
* @Date 2018/11/29 0029 10:58
* @Version 1.0
**/
public class Register1 extends ActionSupport implements ModelDriven<User> {
public String execute() {
System.out.println(user.getUser());
System.out.println(user.getPassword());
System.out.println(Arrays.toString(user.getHobit()));
return NONE;
}
private User user = new User();
@Override
public User getModel() {
return user;
}
}
4.表达式封装:非重点
核心:
把表单数据封装到实体类对象中,只需创建对象不需实例化,
为该对象声明get和set方法
在表单输入项中写表达式: user.username
表达式封装和模型驱动封装对比:都可以把数据封装到实体类对象中去,但是模型驱动封装只能封装到一个实体类对象中,而表达式封装可以封装到多个不同的对象中
表单数据封装到List/Map中
package com.bj169.action;
import com.bj169.entity.Good;
import com.bj169.entity.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @ClassName Register
* @Description TODO
* @Author Administrator
* @Date 2018/11/29 0029 10:58
* @Version 1.0
**/
public class Register2 extends ActionSupport {
private List<User> users;
private Map<String, Good> map;
public Map<String, Good> getMap() {
return map;
}
public void setMap(Map<String, Good> map) {
this.map = map;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
private User user;
private Good good;
public Good getGood() {
return good;
}
public void setGood(Good good) {
this.good = good;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute() {
System.out.println(users.get(0).getUser());
System.out.println(users.get(0).getPassword());
System.out.println(Arrays.toString(users.get(0).getHobit()));
System.out.println(map.get("one").getName());
return NONE;
}
}
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/11/29 0029
Time: 10:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/ehome/register2.action">
用户名:<input type="text" name="users[0].user"/><br>
密码:<input type="password" name="users[0].password"/><br>
爱好:<input type="checkbox" name="users[0].hobit" value="java"/>java
<input type="checkbox" name="users[0].hobit" value="c++"/>c++
<input type="checkbox" name="users[0].hobit" value="c#"/>c#<br>
商品名称<input type="text" name="map['one'].name"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>