1. 访问Servlet API
1.1 使用ActionContext类获取Servlet API对象对应的Map对象
ActionContext ac=ActionContext.getContext();
Map<String,Object> request=(Map<String,Object>)ac.get("request");
Map<String, Object> session=ac.getSession();
Map<String, Object> application=ac.getApplication();
session.put("key","value");
1.2 向Action注入Servlet API对象对应的Map对象
public class HelloAction implements RequestAware,SessionAware,ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
public void setRequest(Map<String, Object> request) {
this.request=request;
}
public void setSession(Map<String, Object> session) {
this.session=session;
}
public void setApplication(Map<String, Object> application) {
this.application=application;
}
1.3 向Action注入原生态Servlet API
public class HelloAction implements ServletRequestAware,ServletResponseAware {
private HttpServletRequest request;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
1.4 使用ServletActionContext类访问Servlet API
- 推荐使用,代码少,方便,能获取所有Servlet API,但是耦合的,必须导入相应的Servlet包,功能完全跟原生态的Servlet API一样
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession();
2. 数据封装
2.1 单个数据封装
2.2 对象数据封装
- 请求参数名称必须以对象名称为前缀
- 在Action声明对象时不用显式new对象,struts会自动创建的
- 需要手动添加对象的getter和setter方法
<form action="/Struts02/addStudent" method="post">
<input type="hidden" name="hidden_value" value="aaa"/>
名字:<input type="text" name="student.name"/><br>
性别:<select name="student.sex">
<option value="1">男</option>
<option value="0">女</option>
</select><br>
<input type="submit" value="提交"/>
</form>
public class StudentAction extends ActionSupport{
private String hidden_value;
private Student student;
public String add(){
System.out.println(hidden_value);
System.out.println(student.getName());
System.out.println(student.getSex());
return SUCCESS;
}
public void setHidden_value(String hidden_value) {
this.hidden_value = hidden_value;
}
public String getHidden_value() {
return hidden_value;
}
public void setStudent(Student student) {
this.student = student;
}
public Student getStudent() {
return student;
}
}
2.3 使用模型驱动ModelDriven接口
- 请求参数名称不需要前缀,只要跟对象字段属性一致即可
- 在声明对象时必须new一个新对象,不然会报空指针异常
- 一个Action只能实现一个ModelDriven接口,所以需要封装多个数据对象时该方式不适用,要用2.2方式
<form action="/Struts02/addStudent" method="post">
名字:<input type="text" name="name"/><br>
性别:<select name="student.sex">
<option value="1">男</option>
<option value="0">女</option>
</select><br>
<input type="submit" value="提交"/>
</form>
public class StudentAction extends ActionSupport implements ModelDriven<Student>{
private Student student=new Student();
@Override
public Student getModel() {
return student;
}
public String add(){
System.out.println(student.getName());
System.out.println(student.getSex());
return SUCCESS;
}
2.4 封装集合数据
<form action="/Struts02/addStudent2" method="post">
名字:<input type="text" name="studentList[0].name"/><br>
班级:<input type="text" name="studentList[0].grade.name"/><br>
名字:<input type="text" name="studentList[1].name"/><br>
班级:<input type="text" name="studentList[1].grade.name"/><br>
名字:<input type="text" name="studentList[2].name"/><br>
班级:<input type="text" name="studentList[2].grade.name"/><br>
<input type="submit" value="提交"/>
</form>
private List<Student> studentList;
public String add(){
for (Student student : studentList) {
System.out.println(student.getName()+","+student.getGrade().getName());
}
return SUCCESS;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}