Struts2接受请求参数

先来几句题外话:很多大佬都说Struts2存在安全问题,已经过时啦,可以直接入手Spring Boot~Spring Cloud之类的,有入手尝试SpringBoot确实开放效率会高很多,非常便捷。但是滴滴滴本来就是个菜鸡啊,有很多东西其实还是想经历一遍,然后达到螺旋式的上升。温故而知新,希望在10月秋招中得到橄榄枝~~~

关于Struts2接收请求参数,滴滴滴将记录下四种方式:

属性驱动方式
域驱动方式
集合数据接收
ModelDriver 方式

属性驱动方式是指服务器接受来自客户端离散数据的方式。用户提交的数据,Action原封不动的进行逐个接收。这种接收方式的要求是:在Action类中定义与请求参数同名的属性,需要定义该属性的set方法,这样能满足Action自动将请求参数的值赋予同名属性

举例如下:

1.在某一jsp文件body中写入form表单

<form action="test/register.action" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="注册"/>
</form> 

2.编写form表单中指定的action

public class RegisterAction{

    private String name;
    private int age;
    //getter and setter

    public String execute(){
         System.out.println("你好" + username);
         System.out.println("你好" + password);
          return "success";
    }

}

3.在web.xml中注册action可用,默认执行execute方法

<package name="滴滴滴" namespace="/test" extends="struts-default">
   <action name="register" class="action.Register">
   <result>/success.jsp</result>
   </action>
</package>

4.编写目标success.jsp接收数据页面

<body>
     姓名 = ${name}<br>
     年龄 = ${age}
</body>

下面我们来着重讲一下域驱动,并且分析执行过程

域驱动方式指,服务器端以封装好的对象方式接收自客户端的数据。将用户提交的多个数据以封装对象的方式进行整体接收。该方式的实现要求:表单提交时,参数以对象属性的方式提交。在Action中要将同名的对象定义为属性。这样请求将会以封装好的对象数据形式提交给Action。

定义POJO:

public class Student{
   private String name;

    private int age;
    //getter and setter
}

编写jsp,提交form表单到action:

<form action="test/register.action" method="post">

姓名:<input type="text" name="student.name"/><br>


年龄:<input type="text" name="student.age"/><br>


<input type="submit" value="注册"/>


</form>
 

编写action:

             public class RegisterAction{

                 private Student student;
                 //getter and setter

                 public String execute(){
                       return "success";
                 }

             }

在struts.xml中注册action:

<package name="滴滴滴" namespace="/test" extends="struts-default">
      <action name="register" class="actions.RegisterAction">
           <result>/success.jsp</result>
      </action>
</package>

编写success.jsp:

<body>
    姓名 = ${student.name}<br>
    年龄 = ${student.age}<br>
</body>

下面来分析下对象类型数据接收的内部执行顺序:

(1)当将表单请求提交给服务器后,服务器首先会解析出表单元素,并读取其中的一个元素name值,读取如下:

    姓名:<input type="text" name="student.name"/><br>

(2)执行Action的getStudent()方法以获取Student对象。判断Student对象是否为null,若为null,则服务器会通过反射创建一个Student对象。

(3)由于此时的Student对象为null,所以系统会创建一个并调用setStudent()方法将student初始化。

(4)此时的student已非空,会将刚才解析出的表单元素,通过调用其set方法,这里是setName()方法,将用户输入的值初始化该属性。

(5)再解析下一个表单元素,并读取其name值。

  年龄:<input type="text" name="student.age"/><br>

(6)再次执行Action的getStudent()方法以获取Student对象。此时的Student对象已非空。

(7)将刚才解析出的表单元素,通过调用其set方法,这里是setAge()方法,将用户输入的值初始化该属性。