【Struts】struts访问Servlet API丶数据封装

1. 访问Servlet API

1.1 使用ActionContext类获取Servlet API对象对应的Map对象
 ActionContext ac=ActionContext.getContext();                //获取ActionContext对象
 Map<String,Object> request=(Map<String,Object>)ac.get("request");     //获取请求的Map
 Map<String, Object> session=ac.getSession();                          //获取session的Map
 Map<String, Object> application=ac.getApplication();                  //获取application的Map
 session.put("key","value");                                           //把值放进session中
1.2 向Action注入Servlet API对象对应的Map对象
public class HelloAction implements RequestAware,SessionAware,ApplicationAware  {
    //定义3个Map<String,Object>属性
    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;
     
    //这3个方法必须实现,把注入的Servlet API赋值给上面的3个属性,这样整个类都可以使用
    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
//实现2个接口
public class HelloAction implements  ServletRequestAware,ServletResponseAware {
    //定义Servlet API的请求request和响应response
    private HttpServletRequest request;
    private HttpServletResponse response;
     
    //实现2个方法实现注入,把注入的值赋值给属性就可以在整个类中使用
    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一样
//获取原生态的request
HttpServletRequest request=ServletActionContext.getRequest();
//获取原生态的response
HttpServletResponse response=ServletActionContext.getResponse();
//根据request获取原生态的session
HttpSession session=request.getSession();

2. 数据封装

2.1 单个数据封装
  • 例子参考2.2
2.2 对象数据封装
  • 请求参数名称必须以对象名称为前缀
  • 在Action声明对象时不用显式new对象,struts会自动创建的
  • 需要手动添加对象的getter和setter方法
<form action="/Struts02/addStudent" method="post">
	<!-- 单个请求参数,对name值没要求 -->
	<input type="hidden" name="hidden_value" value="aaa"/>
	
	<!-- 对象请求参数name格式:对象名.属性名 -->
	名字:<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;             //封装整个对象数据,请求参数要[student.属性]才能封装进对象中
	
	public String add(){
		
		System.out.println(hidden_value);  //直接获取请求参数值
		System.out.println(student.getName());  //把请求参数值封装进对象中后根据对象属性获取值
		System.out.println(student.getSex());
		return SUCCESS;
	}
		
	
	/* 无论封装单个数据或封装对象都要设置getter和setter方法 */
	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">				
		<!-- 模型驱动ModelDriven对请求参数name不要求带前缀,只要name值跟对象的字段值一致即可 -->
		名字:<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>
//实现ModelDriven泛型接口
public class StudentAction extends ActionSupport implements ModelDriven<Student>{
	
	private Student student=new Student();  //这里必须new一个新对象
	
	//重写ModelDriven接口的方法
	@Override
	public Student getModel() {	
		//把student对象返回即可
		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;
	}

	//设置getter和setter方法
	public List<Student> getStudentList() {
		return studentList;
	}

	public void setStudentList(List<Student> studentList) {
		this.studentList = studentList;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值