文章目录
前言
struts2实际上就是对表现层(view)的封装和优化,简单来说就是把一些复杂繁琐的工作为我们提交做好了,我们只需要按照它的模板来用我们以一个简单的登录案例来看看在struts中,Action接收请求参数的方式有哪些。
1.通过Servlet来获取
这个方法与我们之前学的servlet几乎是一样的,action提交参数,servlet根据name获取值。
login.jsp
<form action="${pageContext.request.contextPath}/login.action">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" name="登录">
</form>
LoginAction.java
public class LoginAction extends ActionSupport{
public String login() {
//获取请求参数
//第一种方法:通过request对象
HttpServletRequest request=ServletActionContext.getRequest();
String username=request.getParameter("username");
String password=request.getParameter("password");
return NONE;
}
}
struts.xml
<package name="p1" extends="struts-default">
<action name="login" class="com.cdd.web.action.LoginAction" method="login">
</action>
</package>
这个方法显然是比较麻烦的。如果一个表单的数据项特别多,每个都要get,还是很繁琐的。我们总是要思考怎么去减少重复的工作。
那么就可以利用struts自己已经写好的过滤器,当提交action,struts会自动调用已经加载好的过滤器,它会帮忙将参数注入(set注入),我们只需要在类中写好set即可:
2.通过Action的属性的set方法注入
在1的基础上修改:
LoginAction.java
public class LoginAction extends ActionSupport{
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;
}
public String login() {
System.out.println("username="+username+" password="+password);
return NONE;
}
}
strust2的拦截器会自动帮我们调用set方法。但是这个看起来也比较乱。该函数的一部分是不是很像我们之前学的简单web中的bean(model),那我们把它抽取出来,结构会更加规范清晰。
3.通过Action的属性的set模型的形式注入
新建一个model包,在该包中新建user.java类(model)
User.java
public class User {
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 toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
LoginAction.java
public class LoginAction extends ActionSupport{
User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String login() {
System.out.println(user.toString());
return NONE;
}
}
login.jsp
注意此时的login.jsp发生的变化,因为此时的LoginAction中没有getUsername和getPassword的方法,它们被封装在类user里,所以username、password要加上封装的类的名称,不然使用struts自己的拦截器是接收不到值的。
<form action="${pageContext.request.contextPath}/login.action">
用户名:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"><br>
<input type="submit" name="登录">
</form>
这也是第三种方法的一个弊端,那么接下来第四中方法将完美解决:
4.通过Action模型驱动封装参数【最常用】
就是在action里实现一个模型驱动的接口,通过这种方式,在jsp页面中就不用写user.username
了。
实现步骤:
- 在action中实现一个模型驱动的接口:
ModelDriven<T>
- 提供一个模型属性,并一定要赋值
LoginAction.java
public class LoginAction extends ActionSupport implements ModelDriven<User>{
public String login() {
System.out.println(user.toString());
return NONE;
}
private User user=new User();//提供一个模型属性,并赋值,注意这里一定要new,struts不会帮你new
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
将login.jsp改回来:
<form action="${pageContext.request.contextPath}/login.action">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" name="登录">
</form>
这样看起来,就会发现,相比前三种,第四种方式更加简洁灵活。
这个过程struts内部是怎么做的呢?
这就需要我们打开struts的封装代码看了。
这个过程是struts拦截器为我们做的工作。
打开struts2-core-2.3.33.jar,我们发现默认拦截器中有一个模型驱动。
单击,然后ctrl+f,找到了模型驱动的类
在这个类中,我们发现它是做了如下工作:
5.静态注入【少用】
就是在action中就把值写死了:
struts.xml
<package name="p1" extends="struts-default">
<action name="login" class="com.cdd.web.action.LoginAction" method="login">
<param name="username">张三</param>
<param name="password">123</param>
</action>
</package>
这个就很少用,仅了解就可以了。
如果文章对你有帮助,不要忘了给我点个赞吼( ̄▽ ̄)~
欢迎关注我的微信公众号:松鼠技术站