一.简介

1.作用于web层:Struts2是一种基于MVC模式的轻量级Web框架;

2.各文件夹简介:

    apps:该文件夹存用于存放官方提供的Struts2示例程序,这些程序可以作为学习者的学习资料,可为学习者提供很好的参照。各示例均为war文件,可以通过zip方式进行解压。

    docs:该文件夹用于存放官方提供的Struts2文档,包括Struts2的快速入门、Struts2的文档,以及API文档等内容。

    lib:该文件夹用于存放Struts2的核心类库,以及Struts2的第三方插件类库。

    src:该文件夹用于存放该版本Struts2框架对应的源代码。

3.基础jar包说明

二.struts2环境搭建

1.下载struts2开发包,Struts2的官网: https://struts.apache.org/

2.拷贝struts2必备jar包到web工程的lib目录

3.在类的根路径下创建一个名称为struts.xml的文件,并导入约束
   

  1  <?xml version="1.0" encoding="UTF-8"?>
2 <!-- 导入约束:
3 约束的位置:在struts2的核心jar包中,struts2-core-2.3.24.jar中包含一个名称为:
4 struts-2.3.dtd的约束文件-->
5 <!DOCTYPE struts PUBLIC
6 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
7 "http://struts.apache.org/dtds/struts-2.3.dtd">
8 <struts></struts>

4.在web.xml配置struts2的核心控制器(一个过滤器)

  1     <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
5 id="WebApp_ID" version="2.5">
6 <display-name>day01struts2template</display-name>
7
8 <!-- 配置struts2的核心控制器:一个过滤器 -->
9 <filter>
10 <filter-name>struts2</filter-name>
11 <filter-class>
12 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
13 </filter-class>
14 </filter>
15 <filter-mapping>
16 <filter-name>struts2</filter-name>
17 <url-pattern>/*</url-pattern>
18 </filter-mapping>
19
20 <welcome-file-list>
21 <welcome-file>index.html</welcome-file>
22 </welcome-file-list>
23 </web-app>

5.验证搭建成功与否:把应用部署到tomcat中,启动tomcat,不报异常则表示搭建成功

三.执行过程

1.执行时序:

2.内部执行流程:

四.struts2配置文件

1.struts2中提供了6个配置文件。tomcat启动服务加载我们的应用时,就加载struts2的配置文件。

他们的加载顺序为:default.properties >> struts-default.xml >>  strtuts-plugin.xml >> struts.xml >> struts.properties >> web.xml

注意:

(1))Struts2提供了两种配置的方式。一种是key=value的方式,即使用.properties文件。另一种是xml文件配置。我们推荐使用xml文件(它能描述层级关系)。

(2)当多个配置文件中,有相同的参数,后加载的会把前面的值给覆盖了。

2.struts2中的常用常量:常量定义在了default.properties配置文件中,体现形式都是key=value

3.struts.xml中的标签

(1)constant标签:用于修改struts2中的常量;属性包括name:指定常量的key,value:指定常量的值;

(2)package标签:在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
     a.name:包的名称。必须写。且必须唯一。
     b.extends:一般情况下需要继承struts-default包,但不是必须的,不过如果不继承的话将无法使用struts2提供的核心功能,struts-default.xml中定义着struts-default这个包
         。而struts-default.xml是在我们的struts.xml加载之前加载。
     c.abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。
     d.namespace:名称空间。它的作用是把访问的URL按照模块化来管理。
                 名称空间的写法:必须以/开头;后面可以是字母和数组的组合,也可只有字母;如果有数字的话,数字不能作为/后面的第一个字符。
                 当我们指定了名称空间之后,访问的URL就变成了:名称空间+action标签的name属性取值
                       例如:/n1/hello.action
                           /customer/addCustomer.action
                   名称空间的默认值是:""(struts2官方文档中提供的)

(3)action标签:用于建立动作名称和动作类以及动作方法的对应关系.
     a.name:指定的动作名称。和页面中url后面保持一致。注意此处不能后缀。动作名称必须唯一。
     c.class:指定的是动作类的全限定类名。
     d.method:指定的是动作方法名称.

举例:

  1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- 导入dtd约束 -->
3 <!DOCTYPE struts PUBLIC
4 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
5 "http://struts.apache.org/dtds/struts-2.3.dtd">
6 <struts>
7 <constant name="struts.devMode" value="true"></constant>
8 <constant name="struts.action.extension" value="action,,"></constant>
9
10 <package name="p1" extends="struts-default" abstract="">
11 <action name="sayHello" class="huguangqinj.com.cnblogs.test.Test" method="sayHello">
12 <result name="success">/success.jsp</result>
13 </action>
14
15 <action name="hello2" class="huguangqinj.com.cnblogs.test.Test02" method="hello">
16 <result name="success">/success.jsp</result>
17 </action>
18 </package>
19 </struts>

五.动作类创建的三种方式:

1.无侵入式创建(即创建一个普通的类,实际开发中基本不用)

  1     /**
2 * 我们把动作类中的具有特定编写规则的方法叫做动作方法。 规则是:
3 1、访问修饰符必须是public;
4 2、方法的返回值必须是String;
5 * 3、方法的参数列表必须是空的;
6 */
7
8 public class Test {
9 public String sayHello() {
10 return "success";
11 }
12 }
13

2.实现action接口(实际开发中也不常用)

  1     public class Hello2Action implements Action{
2
3 @Override
4 public String execute() throws Exception {
5 System.out.println("Hello2Action的execute方法执行了............");
6 return ERROR;
7 }
8 }
9

注:默认的动作方法是:execute(),所以可以不指定method属性
     <action name="hello2" class="huguangqinj.com.cnblogs.test.Hello2Action">
             <result name="success" type="dispatcher">/success.jsp</result>
     </action>
     Action接口中的常量:
         SUCCESS:一般多用于成功;
         ERROR:一般多用于动作方法执行失败;
         LOGIN:一般多用于返回登录页面;
         NONE:一般用于不返回任何结果视图,和return null作用是一样的;
         INPUT:一般多用于数据回显,也是struts2中数据回显时的默认返回值。

3.继承Action接口的实现类ActionSupport(最为常用)

  1     public class Hello3Action extends ActionSupport{
2 @Override
3 public String execute() throws Exception {
4 return SUCCESS;
5 }
6 }

  1  <action name="hello3" class="huguangqinj.com.cnblogs.test.Hello3Action">
2 <result name="success" type="dispatcher">/success.jsp</result>
3 </action>

注:
     通过struts-default.xml中我们知道默认的动作类是ActionSupport,所以如果实现该类的execute方法,则可以不用指定class和method属性
   

  1  <action name="defaultAction">
2 <result name="success" type="dispatcher">/success.jsp</result>
3 </action>

六.struts.xml文件中<action>配置方式:

1.原始全匹配方式

2.单一通配符

3.多通配符

4.动态方法调用

举例:

动作类程序:

  1 public class UserAction extends ActionSupport {
2
3 public String addUser(){
4 System.out.println("添加了用户");
5 return SUCCESS;
6 }
7 public String updateUser(){
8 System.out.println("更新了用户");
9 return SUCCESS;
10 }
11 public String deleteUser(){
12 System.out.println("删除了用户");
13 return SUCCESS;
14 }
15 public String findUser(){
16 System.out.println("查询了用户");
17 return SUCCESS;
18 }
19 }
20

1.原始全匹配方式

  1 <package name="user" extends="struts-default" namespace="/user" >
2 <action name="addUser" class="huguangqinj.com.cnblogs.test.UserAction" method="addUser">
3 <result name="success">/success.jsp</result>
4 </action>
5 <action name="updateUser" class="huguangqinj.com.cnblogs.test.UserAction" method="updateUser">
6 <result name="success">/success.jsp</result>
7 </action>
8 <action name="deleteUser" class="huguangqinj.com.cnblogs.test.UserAction" method="deleteUser">
9 <result name="success">/success.jsp</result>
10 </action>
11 <action name="findUser" class="huguangqinj.com.cnblogs.test.UserAction" method="findUser">
12 <result name="success">/success.jsp</result>
13 </action>
14 </package>

页面(index.jsp)访问方式:

  1     <a href="${pageContext.request.contextPath}/addUser.action">添加用户</a>
2 <a href="${pageContext.request.contextPath}/updateUser.action">修改用户</a>
3 <a href="${pageContext.request.contextPath}/deleteUser.action">删除用户</a>
4 <a href="${pageContext.request.contextPath}/findUser.action">查询用户</a>

2.单一通配符

  1 <package name="user" extends="struts-default">
2 <action name="*" class="huguangqinj.com.cnblogs.test.UserAction" method="{1}">
3 <result name="success">/success.jsp</result>
4 </action>
5 </package>

注:页面访问方式和Action类中的方法不变

3.多通配符

  1 <package name="user" extends="struts-default">
2 <action name="*_*" class="huguangqinj.com.cnblogs.test.{2}Action" method="{1}{2}">
3 <result name="success">/success.jsp</result>
4 </action>
5 </package>

页面访问方式(有变动):
 

  1    <a href="${pageContext.request.contextPath}/add_User.action">添加用户</a>
2 <a href="${pageContext.request.contextPath}/update_User.action">修改用户</a>
3 <a href="${pageContext.request.contextPath}/delete_User.action">删除用户</a>
4 <a href="${pageContext.request.contextPath}/find_User.action">查询用户</a>

Action类中的方法不变。

4.动态调用

  1 <!-- 开启动态方法调用 -->
2 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
3 <package name="user" extends="struts-default">
4 <action name="user" class="huguangqinj.com.cnblogs.test.UserAction" >
5 <result name="success">/success.jsp</result>
6 </action>
7 </package>

页面访问方式:

  1     <a href="${pageContext.request.contextPath}/user!addUser.action">添加用户</a>
2 <a href="${pageContext.request.contextPath}/user!updateUser.action">修改用户</a>
3 <a href="${pageContext.request.contextPath}/user!deleteUser.action">删除用户</a>
4 <a href="${pageContext.request.contextPath}/user!findUser.action">查询用户</a>

Action类中的方法不变。

Struts2笔记1的更多相关文章

  1. struts2笔记(3)

    关于回显: 如果是int型,默认就会回显为0,如果不想让回显,则Integer就好 //**************************************声明式验证************* ...

  2. struts2笔记(2)

    <context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...

  3. struts2笔记

    Struts2 中, HTML 表单将被直接映射到一个 POJO,通过params拦截器,类中定义对应属性,及对应set方法即可. Struts2 中,任何一个POJO都可以是一个action类. S ...

  4. struts2笔记4

    1.自定义struts拦截器 应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限” 1)两个页面,一个用户登陆user. ...

  5. struts2 笔记04 杂记

    流程: 1. StrutsPrepareAndExcuteFilter:StrutsPrepareAndExcuteFilter作为前端控制器,是整个Struts2的调度中心. 2. ActionMa ...

  6. struts2 笔记03 异常支持、防止页面刷新和后退、方法验证

    Struts2对异常支持(声明式异常.自动的异常处理), 异常处理(运行期异常事务自动回滚) 1. 自定义异常类,继承RuntimeException或Exception实现构造方法. 2. 配置异常 ...

  7. struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持

    Struts2的上传 1. Struts2默认采用了apache commons-fileupload  2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload ...

  8. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  9. Struts2笔记——利用token防止表单重复提交

    在一些项目中经常会让用户提交表单,当用户点击按钮提交后,如果再次浏览器刷新,这就会造成表单重复提交,若是提交的内容上传至服务器并请求数据库保存,重复提交的表单可能会导致错误,然后跳转到错误界面,这是一 ...

  10. Struts2笔记——struts常用标签

    使用struts标签前,首先要配置struts2架构,然后导入标签库,jsp插入如下语句: <%@taglib uri="/struts-tags" prefix=" ...

随机推荐

  1. Java Learning 000 搭建开发环境

    Java Learning 000 搭建开发环境 你需要两个软件: * JDK (Java Develop Kit :Java开发工具包) * eclipse (eclipse 集成开发环境软件) 安 ...

  2. 剑指offer(65):获取数据流中的中位数

    参考 https://blog.csdn.net/u011080472/article/details/51291089 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位 ...

  3. 线程池和Thread

    1.线程池 创建线程需要时间.如果有不同的短任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多线程时增加,在需要释放资源时减少.不需要自己创建这样一个列表.该列表 ...

  4. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  5. 飘逸的python - @staticmethod和@classmethod的作用与区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  6. HDP3.1 中 YRAN 和 MR2 的内存大小配置的计算方式

    Container 是 YARN 中基本的处理单元,它是对内存.CPU等计算的封装.总的来说,每个core每块硬盘 分配2个 container,能获得较好的集群利用率. 1. 确定可用内存大小. 对 ...

  7. ASP.NET控件之RequiredFieldValidator控件

    作用:对textbox或者其他输入框进行非空验证: 属性:ControlToValidate (选择要指向的控件) ErrorMessage(错误,输入要显示的错误信息) 应用方法: 原型: Demo ...

  8. 洛谷 P1439 【模板】最长公共子序列LCS 解题报告

    题目传送门 是一道十分经典的LCS问题 很容易想到  的一般算法:主题代码如下: for (int i = 1; i <= n; i++) for (int j = 1; j <= n; ...

  9. Jmeter3.2源码编译环境搭建(转)

    1.下载jmeter3.2源码 https://github.com/apache/jmeter/tree/v3_2 https://blog.csdn.net/fly_to_higher/artic ...

  10. maven项目跳转页面报空指针错误 Servlet.service() for servlet 异常

    Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerExceptionat org.jaronsource.ms ...