Struts2 基础知识学习总结
Struts2 概述:Struts2 是一个用来开发 MVC 应用程序的框架,他提供了 Web 应用程序开发过程中的一些常见问题的解决方案,比如对于用户输入信息合法性的验证,统一的布局,国际化等,既然有 Struts2 那么肯定有 Struts1,但是从本质上讲 Struts2 不是从 Struts1 扩展而来的,更应该说是一种换了品牌标签的 WebWork 更合适。
- struts1 VS struts2
- struts1 里使用 ActionServlet 作为控制器,Struts2 使用过滤器作为控制器
- Struts1 中每个 HTML 表单都对应一个 ActionForm 实例,Struts2 中 HTML 表单将被直接映射到一个 POJO
- Struts1 的验证逻辑编写在 ActionForm 中,Struts2 中的验证逻辑编写在 Action 中
- Struts1 中 Action 类必须继承 org.apache.struts.action.Action 类,Struts2 中任何一个 POJO 都可以是一个 Action 类
- Struts2 在页面里使用 OGNL 来显示各种对象模型,可以不再使用 EL 和 JSTL
- Struts2 环境搭建
- 新建 Model,并勾选 Struts2 ,之后选择 Struts2 所要使用的 library,你可以直接在新建页面中选择 Download 进行下载,也可以提前下载好 Struts2 所需要的 jar 包自己构建(这里我选择自己构建的 library)
- http://struts.apache.org/download.cgi#struts2516 在此页面可以选择自己所要使用 Struts2 版本
- 点击下一步之后为自己的 struts2 项目命名(在命名的时候建议在第二栏 Content Root 的路径后改名,若在第一栏中更改只是更改第一栏的,其余两栏不会被更改)
- 点击 Finish 完成 Struts2 项目的创建,所创建的项目如下
- IDEA VS Eclipse
- 若我们使用 Eclipse 去创建 Struts2 项目则需要在下载的 Struts2 包中已有的项目中去拷贝 struts2 文件的格式和 web.xml 文件的配置;IDEA 会为我们自动构建好
- web.xml 文件在 struts2 包下的 struts\apps\struts2-blank1\WEB-INF\web.xml
struts.xml 文件在 struts2 包下的 struts\apps\struts2-blank\WEB-INF\classes,将其创建于 src 目录下
Struts2 HelloWorld
搭建好 Struts2 的开发环境之后我们开始第一个 Struts2 程序的编写,其要求为在一个表单中输入用户的基本信息点击提交后跳转到另一个页面显示用户所输入的信息,在没有学习 Struts2 之前这对于我们来说非常简单,仅需要将页面请求发送到 Servet 中响应请求到另一个页面,使用 EL 和 JSTL 将信息显示即可。对于 Struts2 这当然也算是一个 HelloWorld,我们将借此实例开始 Struts2 各方面的知识讲解。
- 在 index.jsp 中编写页面代码,供用户输入基本信息,如下:
- 依据表单 name 属性编写实体类,并创建 getXxx 和 setXxx 方法,Customer.java
- 在 struts.xml 文件中编写代码处理 struts2 请求
- 返回显示页面 show.jsp
struts.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="helloWorld" extends="struts-default"><action name="input" class="com.struts2.hello.test.Customer" method="print"><result name="print">/show.jsp</result></action></package></struts>
Customer.java
package com.struts2.hello.test;/*** Created by shkstart on 2018/03/24.*/public class Customer {private String userName;private String email;private String address;/** getXxx() setXxx() 方法**/public String print() {System.out.println(new Customer());return "print";}@Overridepublic String toString() {return "Customer{" +"userName='" + userName + '\'' +", email='" + email + '\'' +", address='" + address + '\'' +'}';}}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Input</title></head><body><table><form action="input.action" method="post"><tr><td>UserName</td><td><input type="text" name="userName"></td></tr><tr><td>Email</td><td><input type="text" name="email"></td></tr><tr><td>Address</td><td><input type="text" name="address"></td></tr><tr><td><input type="submit" value="Submit"></td></tr></form></table></body></html>
show.jsp(只展示 Body 标签内容)
UserName: ${userName}<br>Email: ${email}<br>Address: ${address}<br>
代码详解
- Customer.java 中成员变量和 index.jsp 中的属性一一对应,不忽略大小写;
- show.jsp 中用于显示的和 Customer.java 中的成员变量一致,否则无法显示
- index.jsp 中的 form 表单 action 值应该设置为struts.xml 文件中的 action 的name 属性
- struts.xml 文件中的 action 节点的 method 属性应 Custome.java 中的
String print()
方法,result 节点的 name 属性为String print()
方法的返回值 - result 节点的值为处理了该 struts2 请求后所响应的页面
对于 show.jsp 页面的显示我们在后面会详细讲解有关知识,至此我们 Struts2 的 HelloWorld 就到这里,我相信和我一样的小白跟着做下去应该不会出什么大的差错!!
struts.xml 文件节点
- package 属性 --- struts2 使用 package 来组织模块
- name 属性为必须的,用于其他包应用当前包;
- extends 表示当前包所继承的包,即可以继承其中所有的配置,通常为 struts-default;
- nameSpace默认值为 /,当设置此属性的时候应在 URL中的 servletPath 前加上所设置的值
- action 属性 --- 一个 struts2 请求就是一个 action
- result (action 的子标签)标签体表示响应结果
- name 对应 struts2 请求的名字,不包含扩展名(扩展民默认为 .action);
- class 为该 struts2 请求将要去的类的全类名;
- method 为所要去执行的该类的方法,该方法返回值必须为 String,且需要和 result 节点的 name 属性一致
- result 的 name 属性值默认为 SUCCESS,class 默认属性为 ActionSupport,method 默认值为 execute
- 一个 action 可以有多个 result 子节点,多个 result 子节点使用 name 属性区分
- result 节点的 type 属性默认为 dispatcher(转发),表示结果的响应类型
Action VS action
- 在此案例中 Customer.java 就是 struts2 中所说的 Action 类,index.jsp 发送的请求为一个 action 请求;
- action 代表一个 struts2 请求,Action 类代表能够处理该 struts2 请求的类
- Action 类的成员变量必须遵循与 JavaBean 属性名相同的命名规则,属性的类型可以是任意类型,需与表单的 name 属性相同
- 至少有一个供 struts2 执行这个 action 请求时所要调用的方法
- 同一个 Action 也可以包含多个 action 方法
- Action 类必须有一个无参的构造器,因为会用到反射赋值