一、概述

1、什么是Struts2

  Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

二、Struts2入门

1.环境下载

下载地址:http://struts.apache.org/download.cgi;

2. 导入jar

​ struts的jar比较多,可以从Struts官方提供的demo中拿到必要的jar就行. 在apps/struts2-blank项目下

3. 编写Action类

  • 新建一个类,里面定义一个方法

  • /**
    *一,创建了一个普通的类 ,定义了一个execute()方法
    *好比我们之前:创建了一个ProductServlet,然后创建了一个doGet()方法一样
    *二, 配置Action 好比配置Servlet一样,只不过不在web.xml里面配置,自己整了一套
    * 在src目录下struts.xml的文件里面配置
    */
    public class ActionDemo {
    public void execute(){
    System.out.println("收到到了请求...");
    }
    }

4. 配置struts.xml文件

  • 在src底下新建一个xml 名称为 struts.xml. 在struts.xml里面配置action

    <?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="test" extends="struts-default" namespace="/">
    <!--一个请求对应一个Servlet, struts2里面一个请求配置一个Action -->
    <action name="demo" class="com.itheima.web.ActionDemo"></action>
    </package>
    </struts>

注意:

  1. struts.xml文件名不可随意取,必须叫做struts.xml

  2. struts.xml必须放在src类路径下

  3. 到struts的核心包中可以找到struts-2.3.dtd文件(建议配置本地的dtd,没网情况下也可以使用...)

5. 前端控制器配置

  • 在web.xml下配置

    <!--前端控制器(过滤器)  -->
    <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter> <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    其实就是在web.xml中配置struts2的filter

6. 编写访问路径,进行测试

http://localhost:8080/day42A_Struts2/demo

三、Struts2的运行流程

1.服务器启动(项目部署)

  • 当项目部署的时候,会执行StrutsPrepareAndExecuteFilter的init()方法,在init方法里面有这样的一行代码 :

    dispatcher = init.initDispatcher(config);

  init_DefaultProperties(); // [1] —> 加载 default.properties 常量配置(国际化编码, 文件上传的size...)
init_TraditionalXmlConfigurations(); // [2] ->加载 struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] —> 加载struts.properties
init_CustomConfigurationProviders(); // [5] ---> 加载自定义的一些初始化类. 一般不写
init_FilterInitParameters() ; // [6] ---> 加载初始化参数。 initparam
init_AliasStandardObjects() ; // [7] ---> 给对象起别名
  • 图示

    顺序 配置文件名 所在位置 说明
    1 default.properties ..src\core\src\main\resources\org\apache\struts2 不能修改
    2 struts-default.xml ..\struts-2.3.32\src\core\src\main\resources 不能修改
    3 strtuts-plugin.xml 在struts2提供的插件jar包中 不能修改
    4 struts.xml 我们的应用中 我们修改的:推荐
    5 struts.properties 我们的应用中 我们修改的:不建议用
  • 后面配置的会把前面的覆盖

2.请求到来

​ 当我们在浏览器输入请求路径 http://localhost:8080/day01A_Struts2/demo01

四、Struts.xml中的配置详解

  • eg

    <struts>
    <!--一, package指的是一组请求的集合; 一般一个模块创建一个package
    1.1 name: 包名; 随便取, 不要重复就行
    1.2 extends: 继承的意思, 我们当前的test包继承了名字叫struts-default这个包, struts-default这个包里面的功能我们test包都可以使用的
    1.3 namespace: 名称空间; 用意在于访问action的时候加一层路径(方便自己看的)
    eg: 当前配置的是/, http://localhost:8080/day42A_Struts2/demo01
    当前配置的是/test, http://localhost:8080/day42A_Struts2/test/demo01
    1.4 abstract: 抽象, 用意在于表明这个包是抽象的, 也就是说让别的包继承的; 如果这个包让别的包继承,习惯设置为true
    -->
    <package name="test" extends="struts-default" namespace="/" >
    <!--二, 一个请求配置一个Action标签, 不是说一个请求就要创建一个Action类
    2.1 name: action的名字, 说白了就是当前action的访问路径. 名字随便取, 不要重复就行了
    2.2 class:当前Action类的全限定名
    2.3 method: 处理当前请求的方法; 说白了也就是当前Action类里面的方法名(默认是execute)
    -->
    <action name="demo01" class="com.itheima.web.ActionDemo01"></action>
    <action name="demo01_regist" class="com.itheima.web.ActionDemo01" method="regist">
    <!--三, 配置的就是结果
    3.1 name: 结果视图的名字; 说白了就是处理这个请求对应方法的返回值
    3.2 type: 配置跳转的类型(默认就是转发到页面)
    3.3 result标签里面值: 就是要跳转的路径
    -->
    <result name="registSuccess">
    /registSuccess.jsp
    </result>
    </action>
    </package>
    </struts>

五、Action进阶

1、Action规范和特点

1.1 Action的编写规范
  1. action类需要提供无参构造函数

  2. action中方法规定

    ​ 修饰符:方法的修饰符必须是public

    ​ 参数列表:方法必须是无参方法

    ​ 返回值类型:String

1.2 action多例性

​   每次url访问时,action的实例就会被创建一次。action类是多实例的。

2.Action的通用写法

2.1普通类

​ 这种方式就是我们最开始给大家写的, 就是一个普通类,然后里面写一个方法,具有String类型返回值即可。

2.2实现Action接口
  • 好处是 : 我们少写一点代码, 可以使用接口里面定义的常量 SUCCESS \ ERROR ....

    public class HelloWorld02 implements Action{
    @Override
    public String execute() throws Exception {
    System.out.println("hi struts");
    return SUCCESS;
    }
    }
2.3继承ActionSupport【重点】

​   这种做法,相比较前面的好处在于, ActionSupport 虽然是实现了Action的接口 , 但是内部自己也扩展了些功能 :eg: 提供了信息的校验、并且能够根据校验的结果回到原来的页面。如 : 它里面也集成了获取国际化资源的方法,我们可以直接使用。

  • Java代码

    public class ActionDemo03 extends ActionSupport {
    @Override
    public String execute() throws Exception {
    System.out.println("ActionDemo03 execute()...");
    return SUCCESS;
    }
    }

3.Action访问的路径配置

3.1通过method属性访问【重点】

​   一般来讲,我们的action类都不会只有一个execute方法,如果存在很多的方法 ,我们如何在struts.xml 里面映射到方法里面去呢? struts提供的第一种方法是在action里面使用method属性来指定访问的具体的方法。 举例如下:

<action name="user_login" class="com.itheima.web.UserAction" method="login"></action>
<action name="user_regist" class="com.itheima.web.UserAction" method="regist"></action>
<action name="user_active" class="com.itheima.web.UserAction" method="active"></action>
<action name="user_loginout" class="com.itheima.web.UserAction" method="logout"></action>

  这样看上去是挺好的。 直接指定method ,就会找到具体的方法。 但是如果以后我们的方法很多,这样就要配置很多的action标签了。这就不太好维护了。代码先就显得很多,所以这种方式用的不多.

3.2通过通配符访问【重点】

​      通配符的访问其实还是要依赖于method的属性,只不过在匹配来访的地址 和 action的名称的时候使用通配符来匹配。采取method属性访问的方式,一个请求需要写一个Action。

  如果采取通配符的方式,只需要配置一个Action就可以了, *用于表示匹配任意字符。 后面的{1} 就表示能够取到 * 所处位置的字符,然后找到对应的方法。

<action name="user_*" class="com.itheima.web.UserAction"  method="{1}"></action>

  我们在开发中通常采取通配符方式访问.

3.3通过动态方法访问【了解】

​   第三种方式可读性不强 ,这种方式使用动态代理访问。用的很少. 使用步骤:

  1. 打开动态访问开关,在Struts.xml文件配置

    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  2. 配置Action的名字

    <action name="userAction" class="com.itheima.web.UserAction"></action>
  3. 访问路径通过actionName + !+ action类中的方法名访问

    http://localhost:8080/day02D_Struts2/userAction!login

知识点补充:Constant用来配置常量值的,目的是修改Struts的default.propertis中的默认值的;

​  在Struts.xml中使用 <constant name="" value=""></constant>标签

  • 常量举例

    常量名 常量值 说明
    struts.i18n.encoding UTF-8 应用中使用的编码
    struts.multipart.maxSize 2097152 文件上传总文件大小限制:2M
    struts.action.extension action,, 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔
    struts.enable.DynamicMethodInvocation false 是否允许动态方法调用
    struts.devMode false 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。
    struts.ui.theme xhtml 页面展示用的主题
  • eg,在struts.xml里面配置常量

    <struts>
    <!-- 一,配置常量的 -->
    <!-- 1.1 打开允许动态方法访问的权限 -->
    <!-- <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> -->
    <!--1.2 添加action的访问的后缀(有用的,权限的框架(Shiro,SpringSecurity)) -->
    <constant name="struts.action.extension" value="pri,do,action,,"></constant>
    <!-- 1.3配置改了struts.xml配置文件,不需要重启服务器 -->
    <constant name="struts.devMode" value="true"></constant>
    </struts>

六、Struts2 + Hibernate整合

1. 案例需求

  • 使用Struts2 + Hibernate完成展示商品的案例.

2. 案例实现

2.1 创建web层(struts2)
  • 创建web项目, 导入jar包

  • 创建CategoryAction

    public class CategoryAction extends ActionSupport {
    
        public String findAll(){
    try {
    //1. 获得请求参数
    //2. 调用业务
    CategoryService categoryService = new CategoryService();
    List<Category> list = categoryService.findAll();
    //3. 把list存到域里面, 转发页面
    HttpServletRequest request = ServletActionContext.getRequest();
    request.setAttribute("list", list);
    return "findAllSuccess";
    } catch (Exception e) {
    e.printStackTrace();
    ServletActionContext.getRequest().setAttribute("msg", "查询失败...");
    return "findAllError";
    }
    }
    }
  • 在classpath(src)目录下创建struts.xml配置CategoryAction

    <?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="category" extends="struts-default" namespace="/">
    <action name="category_*" class="com.itheima.web.CategoryAction" method="{1}">
    <result name="findAllSuccess">
    /list.jsp
    </result>
    <result name="findAllError">
    /msg.jsp
    </result> </action>
    </package>
    </struts>
  • 在web.xml里面配置前端控制器

    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

3. 发现获得商品的时候出现了bug

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.itheima.bean.Category.products, could not initialize proxy - no Session

  1. 使用openSession(), 不手动调用close() [千万不要用]

  2. 不使用懒加载, 再查询类别的同时就把商品查询出来

    <set name="products" fetch="select" lazy="false">
    <!--1.2 column: 外键的列名 -->
    <key column="cid"/>
    <!--1.3 class: 对方类的全限定名 -->
    <one-to-many class="com.itheima.bean.Product"/>
    </set>
  3. 还使用懒加载, 在CategoryDao使用一个商品就行了

Struts2(一)— 入门的更多相关文章

  1. struts2之入门login

    1.struts 最小开发需要的jar有: struts2-core-2.2.3.jar :Struts 2框架的核心类库 xwork-core-2.2.3.jar :XWork类库,Struts 2 ...

  2. Struts2学习第一天--Struts2的概述、Struts2的入门、Struts2常见的配置、Struts2的Action的编写

    action的name要与访问路径对应.hello.action. 加到tomcat启动 访问:http://localhost:8080/struts2-1/demo1/demo1.jsp 改为su ...

  3. Struts2 第二讲 -- Struts2的入门

    搭建struts2环境时,我们一般需要做以下几个步骤的工作: 第一步:创建javaweb工程(这个很废话有木有) 第二步:找到开发Struts2应用需要使用到的jar文件.(这个很白痴有没有) 到ht ...

  4. Struts2基础入门

    Struts2基础入门 创建一个web工程 0)导包并且创建一个核心配置文件 <?xml version="1.0" encoding="UTF-8"?& ...

  5. (转)Struts2快速入门

    http://blog.csdn.net/yerenyuan_pku/article/details/66187307 Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架, ...

  6. 1、Struts2基本入门

    一.了解了这几个主要的优点,会促使你考虑使用Struts2 : 1.POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分.在Struts2框架下,你 ...

  7. 1.Struts2快速入门

    Struts2是一个基于MVC设计模式的Web层框架 Web层框架的特点:前端控制器模式 快速入门 1.下载Struts2的框架包 https://struts.apache.org/ 2.导入jar ...

  8. struts2快速入门

    1. 下载开发包 课程 以 struts2 3.15.1 讲解 2. 目录结构 apps : struts2官方demo docs : 文档 lib : jar包 src : 源码 3. 导入jar包 ...

  9. 深入分析JavaWeb Item43 -- Struts2开发入门

    一.Struts2概述 1.Struts2是什么? Struts2是一个M(模型-域–范围模型)V(View视图)C(控制器)框架(模型2).框架都是一个半成品. 提高开发效率. Struts1是一个 ...

  10. JavaWeb框架_Struts2_(一)----->Struts2 框架入门

    1.  框架入门 2.1  Struts2简介 (1). Struts2是一种基于MVC模式的的轻量级Web开发框架. MVC模式:MVC全名是Model View Controller,是模型(mo ...

随机推荐

  1. iOS学习笔记(6)——翻译苹果文档About Windows and Views

    About Windows and Views 关于窗口和视图 In iOS, you use windows and views to present your application’s cont ...

  2. c常用函数

    一.strtol long int strtol(const char *nptr, char **endptr, int base) strtol()会将nptr指向的字符串,根据参数base,按权 ...

  3. 【笔记】AJAX+SweetAlert插件实现删除操作

    [笔记]AJAX+SweetAlert插件实现删除操作 Django AJAX SweetAlert  展示 SweetAlert 插件介绍 SweetAlert 是一个 JS 插件,能够完美替代 J ...

  4. 博客主题皮肤探索-添加新功能和fiddler的css/js替换

    还有前言 使用了主题之后,发现还差了一点功能.最新评论没有了,导致读者回复需要一点时间去找到底回复了哪条博客.于是就有了添加功能的想法. 如何调试CSS/JS 打开f12,可以看见加载的js资源都是混 ...

  5. 小程序中实时将less编译成wxss

    1.npm或者yarn全局安装wxss-cli npm install -g wxss-cli 2.运行wxss-cli命令(weuiTest为小程序目录) wxss ./weuiTest 实时监听w ...

  6. Mac安装的PyCharm找不到顶部菜单栏 PyCharm找不到setting PyCharm不能个性化设置和直接导库

    安装的是最新版的PyCharm,打开发现没有顶部菜单栏,不能直接导库..有点方 以前的就是下面这种 找了很久发现原来在右下角!!!眼拙 点击画圈圈的地方就可以直接进去导库这些啦〜

  7. 修改docker的port端口映射

    原以为修改docker的端口映射只是一条命令就可以搞定,结果发现没那么简单,记录一下以防忘记.1. 查看需要修改的容器,记住container iddocker ps -a2. 停止容器docker ...

  8. CentOS和Ubuntu系统下安装 HttpFS (助推Hue部署搭建)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

  9. 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入tensorflow失败报错问题解决

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9747019.html 基本开发环境搭建 1. Microsoft Windows 版本 关于W ...

  10. .net core 多平台部署

    首先下载地址 https://dotnet.microsoft.com/download 下载.net core 和  .net core runtime  然后安装他们 控制台运行项目: 找到你的工 ...