Struts2的Servlet的API的访问
- 完全解耦合的方式:ActionContext
//得到ActionContext对象
ActionContext context=ActionContext.getContext();
//接收数据
Map<String,Object> map=context.getParameters();
//向域对象中存入数据
context.put("reqName","reqValue");//相当于request.setAttribute()
context.getSession().put("sessionName","sessValue");//相当于session.setAttribute()
context.getApplication().put("appName","appValue");//相当于application.setAttribute()
注意:这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。
- Servlet原生API的方式:ServletActionContext
//直接获得request对象,通过ServletActionContext
HttpServletRequest requset=ServletActionContext.getRequest()
注意:这种方式可以操作域对象的数据,同时也可以获得对象的方法。
- 实现相应的接口
略
补充
- Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。
- Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。
struts的数据封装
- 属性驱动:提供属性set方法的方式(不常用)
- 在Action中提供对应的属性,以及set方法
- 属性要和页面中的name对应,否则得到的值为null
<!-- 编写页面 -->
<h3>方式一:属性驱动-提供set方法的方式</h3>
<form action="${pageContext.request.contextPath }/user" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
工资:<input type="text" name="salary"/><br/>
<input type="submit">
</form>
=======================================
//编写Action
public class UserAction extends ActionSupport {
//提供对应的属性
private String username;
private String password;
private String age;
private Date birthday;
private Double salary;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(String age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public String execute(){
//接收数据
System.out.println(username);
System.out.println(password);
System.out.println(age);
System.out.println(birthday);
System.out.println(salary);
return NONE;
}
}
- 属性驱动:页面中提供表达式的方式
- 在Action中提供封装数据的对象
- 提供该对象的get,set方法
<h3>方式二:属性驱动-页面中提供表达式的方式</h3>
<form action="${pageContext.request.contextPath }/user2" method="post">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="password" name="user.password"/><br/>
年龄:<input type="text" name="user.age"/><br/>
生日:<input type="text" name="user.birthday"/><br/>
工资:<input type="text" name="user.salary"/><br/>
<input type="submit">
</form>
=====================================
public class UserAction2 extends ActionSupport {
//提供一个User对象:
private User user;
//提供user的set和get方法:一定要提供方法;否则除了第一个值外,其他值都是null.
//因为拦截器完成数据封装,需要创建User对象,
//通过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;
}
}
- 模型驱动的方式
- 实现ModelDriven 接口
- 手动提供对象的实例,并交给Model返回
<h3>方式三:模型驱动-采用模型驱动的方式</h3>
<form action="${pageContext.request.contextPath }/user3" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
工资:<input type="text" name="salary"/><br/>
<input type="submit">
</form>
=============================================
public class UserAction3 extends ActionSupport implements ModelDriven<User> {
// 模型驱动使用的对象: 前提必须手动提供对象的实例
private User user=new User();//手动实例化User
@Override
//模型驱动要使用的方法:
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}