后台的Action跟我们前台的页面来通讯的时候,由于它拿不到request,session,servletContext比如当我们有人登陆了,我们要在session中设一个值,表示它登陆了,但是如果你Action访问不到session,你如何把相关的数据设到session里面,response不用访问它,因为我们的结果是通过result返回的。(其实request我们也很少去拿它,因为我们Action的成员变量默认会起到request的作用,它自己会放到valueStack里面, valueStack本身就是放到request里面,所以根本不用去拿request.)
采取IOC(控制反转)的设计思想,依赖注入DI
Index.jsp
<body>
<form action="User_add.action">
用户名<input type="text" name="user.username"><br>
密码<input type="password" name="user.password" ><br>
<input type="submit" value="提交" >
</form>
</body>
UserAction.java
package com.demo.web.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.demo.pojo.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware {
private User user;
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
/**
* 新增
*
* @return
*/
public String add() {
System.out.println("进入add方法...");
System.out.println(user);
session.put("user", user);
return "add";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
}
Struts.xml
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.action.extension" value="htm,action,do"></constant>
<package name="default" namespace="/" extends="struts-default" >
<action name="*_*" method="{2}" class="com.demo.web.action.{1}Action">
<result name="add" >{2}{1}.jsp</result> </action>
</package>
</struts>
addUser.jsp
<body>
<h1>欢迎进入add页面</h1>
用户名:${user}
</body>