文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.14 | lutianfei | none |
struts2中获取请求参数
- 在struts2中action是什么?(struts2是一个mvc框架)
- View : jsp
- Model : action
- Control : action & StrutsPrepareAndExecuteFilter
1.属性驱动
1.直接将action做一个model(类似bean结构),就可以得到请求参数.
- 问题1:action封装请求参数,会不会存在线程安全问题?
- 不会:因为每一次请求,都是一个新的action。
- 缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
- 优点:简单。
- 这种方式,底层是通过反射来实现的。
- 问题1:action封装请求参数,会不会存在线程安全问题?
配合第一天作业案例,修改Login1Action.java
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
// 2.判断用户名与密码是否正确
if ("tom".equals(username) && "123".equals(password)) {
request.getSession().setAttribute("username", username);
return SUCCESS;
} else {
request.setAttribute("login.message", "用户名或密码错误");
return "failer";
}
}
}
2.在action中声明一个model。
- 在页面上使用ognl来描述
- 注意修改:
<input type="text" name="user.username">
- 优点:简单,解决了第一种封装的问题
- 缺点:在页面上使用了ognl表达式,页面不通用了。
- 问题:这种方式,数据是怎样封装的?
- 通过struts2中的interceptor进行了数据封装.
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
- 通过struts2中的interceptor进行了数据封装.
Login2Action.java
//获取请求参数 属性驱动 第二种,直接在action声明一个model
public class Login2Action extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
// 2.判断用户名与密码是否正确
if ("tom".equals(user.getUsername()) && "123".equals(user.getPassword())) {
request.getSession().setAttribute("username", user.getUsername());
return SUCCESS;
} else {
request.setAttribute("login.message", "用户名或密码错误");
return "failer";
}
}
}
- login2.jsp
<body>
${requestScope["login.message"] }<br>
<form action="${pageContext.request.contextPath}/login2" method="post">
username:<input type="text" name="user.username"><br>
password:<input type="password" name="user.password"><br>
<input type="submit" value="登录">
</form>
</body>
2.模型驱动(在开发中应用比较多)
- 开发步骤:
- 1.让action类实现 ModelDriven
- 2.重写getModel方法
- 3.在action中实例化一个model对象,让getModel方法返回这个对象。
public class Login3Action extends ActionSupport implements ModelDriven<User> {
//第一步:implements ModelDriven<User>
private User user = new User(); //第三步
public User getModel() { //第二步
return user;
}
}
//jsp
<body>
${requestScope["login.message"] }<br>
<form action="${pageContext.request.contextPath}/login3" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
- 优点:解决了属性驱动存在的问题
缺点:一次只能封装一个model对象.
struts2 有很多围绕模型驱动的特性
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
为模型驱动提供了更多特性