获取请求参数
- 本人独立博客https://chenjiabing666.github.io
- 在Servlet中可以调用HttpServletRequest的getParameter()的方法接收传递过来的请求参数,但是在struts2中对这种方式进行了三种封装
- 我们一般发出请求都是通过表单传递的,但是在服务端如果获取表单传递过来的值,其中有三种不同的方式
属性驱动
- 属性驱动就是将一个Action类作为一个POJO类,在类中定义表单的请求参数的
name
属性,但是还要为这些成员变量设置get,set方法。因为在获取请求参数的时候自动调用的是set方法,获取参数的时候调用的是get方法。 - 当表单提交的时候,实际上是提交了表单元素的值,之后会给ACtion类中的属性设置值(set),因此这里的属性需要添加set方法
- 当表单请求成功的时候,实际上是先经过Action类,然后跳转到指定的视图,这个过程都是转发(ddispatcher),因此会保留request域中的键值对,此时在success.jsp页面中使用EL表达式取值即可(get方法),取值使用的是属性的get方法,因此需要添加get方法
实现
- SimpleAction类,其中定义了属性
- 为每一个属性都需要添加get,set方法
- 表单提交之后会自动调用属性的set方法为其赋值
- 跳转到指定视图之后,使用EL表达式取值时会调用属性的get方法
代码语言:javascript
复制public class SimpleAction implements Action {
private String name; //姓名
private String password; //密码
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() {
System.out.println(name "----" password);
return SUCCESS;
}
}
代码语言:javascript
复制 <action name="simple" class="com.jsnu.struts2.controller.SimpleAction">
<result name="success">/jsp/success.jsp</result>
<result name="input">/jsp/input.jsp</result>
</action>
- index.jsp 提价表单
- input中的属性
name
对应的是SimpleAction的属性名
代码语言:javascript
复制<body>
<%
String path = request.getContextPath();
String basePath = request.getScheme() "://" request.getServerName() ":" request.getServerPort() path "/";
%>
<form action="<%=basePath %>simple" method="post">
name:<input type="text" name="name">
password:<input type="text" name="password">
<input type="submit" value="提交">
</form>
</body>
- success.jsp 表单提交成功之后跳转的视图
代码语言:javascript
复制<body>
<h1>success</h1>
<h1>${name }</h1>
<h1>${password }</h1>
</body>
域驱动
- 域驱动是将表单中name属性抽象出一个JavaBean类成为一个modle,并不是Action类成为modle了,只需要在Action类引用JavaBean的对象即可(作为成员变量,get,set,方法都有)
- 既然Action类中的成员变量已经是JavaBean的对象了,那么表单的中name属性的设置就要使用OGNL形式的取该对象中的属性了,而不是像属性驱动一样直接设置的属性
实现
- JavaBean实体类
- 必须为每一个属性设置get,set方法
- 必须有无参构造
代码语言:javascript
复制/**
* POJO类,model 其中必须为每一个属性设置get,set方法
*/
public class User {
private String name; // 姓名
private String password; // 密码
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- Action类
- JavaBean对象作为其成员变量,必须为这个成员变量设置get,set方法
- 必须有一个无参构造
代码语言:javascript
复制public class SimpleAction implements Action {
private User user; // POJO类对象,必须有set,get方法,和无参构造方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() {
System.out.println(user.getName() "--->" user.getPassword());
return SUCCESS;
}
}
- struts.xml配置同上
- index.jsp 表单提交
- input中的name属性使用OGNL表达式来设置其值
代码语言:javascript
复制<%
String path = request.getContextPath();
String basePath = request.getScheme() "://" request.getServerName() ":" request.getServerPort() path "/";
%>
<form action="<%=basePath %>simple" method="post">
name:<input type="text" name="user.name">
password:<input type="text" name="user.password">
<input type="submit" value="提交">
</form>
- success.jsp页面
- 此时使用EL表达式取值,也是使用OGNL形式的取值方式
代码语言:javascript
复制<body>
<h1>success</h1>
<h1>${requestScope.user.name }</h1>
<h1>${requestScope.user.password }</h1>
</body>
模型驱动
- 模型驱动和域驱动比较相似,都是用一个JavaBean类作为model,但是模型驱动必须实现ModelDriven<>这个接口,这个可以指定一个泛型,其中泛型类为JavaBean的类,必须实现的方法是getmodel()方法
Type getModel(){}
返回一个Type对象,这个对象是在实现接口的时候定义泛型类(JavaBean类)- 使用模型驱动,那么表单中的name属性值就不需要使用OGNL表达式了,而是直接使用属性字段即可,这个和属性驱动一样的
- JavaBean类,这个和上面的一样
- Action类,实现了ModelDriver<JavaBean> 接口
代码语言:javascript
复制//实现ModelDriven接口<>指定的泛型为JavaBean类
public class SimpleAction implements Action,ModelDriven<User> {
private User user; // POJO类对象,必须有set,get方法,和无参构造方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() {
System.out.println(user.getName() "--->" user.getPassword());
return SUCCESS;
}
@Override
public User getModel() {
System.out.println("调用了getModel方法");
// 如果对象为空,就创建一个对象,然后返回
if (user == null) {
this.user = new User();
}
return user;
}
}
- struts.xml 同上
- index.jsp 表单提交
- 这里name属性值直接使用JavaBean属性即可,必须字段一样
代码语言:javascript
复制<form action="<%=basePath %>simple" method="post">
name:<input type="text" name="name">
password:<input type="text" name="password">
<input type="submit" value="提交">
</form>
代码语言:javascript
复制 <h1>success</h1>
<h1>${requestScope.user.name }</h1>
<h1>${requestScope.user.password }</h1>
总结
- 根据我的经验,在框架整合的基础上,我们必须使得单独的实体类对应一张表,那么此时就需要使得Action类和JavaBean分离,因此我推荐使用第二种方式,第三种方式还需要实现接口,对类的污染比较严重