前言

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了。
实现步骤:

  1. 在action中实现一个模型驱动的接口:ModelDriven<T>
  2. 提供一个模型属性,并一定要赋值
    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>

这个就很少用,仅了解就可以了。

如果文章对你有帮助,不要忘了给我点个赞吼( ̄▽ ̄)~
欢迎关注我的微信公众号:松鼠技术站