Day43-Struts01

一、Struts介绍

Struts框架其实就是对之前的servlet进行了包装。让我们写很少的代码即可完成web的请求和处理。所以在学习struts的时候,尽量跟servlet对比,就会发现很多相似之处。
Struts 是 Apache软件基金会(ASF)赞助的一个开源项目 , 它通过采用servlet 和 JSP 实现了基于Java EE Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
Struts 早起发布的版本是 1.x 版本, 后来和另一个也很优秀的EE框架 WebWork 一起整合 ,就形成了我们目前熟悉的Struts2.x
这里写图片描述
这里写图片描述

二、Struts 入门

以一个案例来入门Struts的用法:

1)导入jar包
官方下载的包里面有很齐全的jar包,一共有106个,但是我们平常的开发都不会用到这么多。
在apps文件夹下有许多的war工程,其中blank工程就是一个空的工程所必须的jar包。将struts2-blank.war的后缀名修改成为rar或者zip,然后进行解压,在web-inf下面的lib中有Struts所必须的jar包(13个)。可以满足基本的需求了。

2)新建一个类,里面放置一个execute方法 //默认是执行execute方法

        public class ActionDemo {

            public void execute(){

                System.out.println("执行了请求了~~~");

            }

        }

3)配置sturts.xml
src底下新建一个xml 名称为 struts.xml

4)在struts.xml里面配置action
一个package就表示一组业务,继承了一个自带的包struts-default
namespace的默认只是空串“”

<?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">
<!-- 这段代码如何找,导入的jar包中找到struts2-core-2.3.32.jar包,下方有struts-2.3.dad,点开这个文件就可以找到这段约束
-->

<!-- 配置action -->
<struts>
      <package name="demo" extends="struts-default" namespace="/">  
           <action name="demo" class="com.itheima.test.ActionDemo"></action>
      </package>
</struts>

5) 在web.xml里面配置过滤器(也有称之为 前端控制总栈 )
web.xml是配置struts的核心控制器的配置

      <filter>
           <filter-name>struts2</filter-name>
           <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            <!--这个类如何找,核心jar包,按上面class的路径-->
      </filter>
      <filter-mapping>
           <filter-name>struts2</filter-name>
           <url-pattern>/*</url-pattern>
      </filter-mapping>

三、Struts运行过程

因为配置了前端过滤器filter,里面配置了类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilte,所以会去找这个类,这个类相当于一个servlet,有一个初始化方法init();
init()方法有这么一段代码:dispatcher = init.initDispatcher(config);点进去,在dispatcher.init()代码,点进去,会发现他初始化所做的一系列操作

  • 项目部署
    1. 执行过滤器的init方法
      前端拦截器先找到类:
      在init方法里面有这样的一行代码 dispatcher = init.initDispatcher(config);
init_DefaultProperties(); // [1]  ---> 加载 default.properties
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,在主包里面有
 【2】加载三个文件
 【3】加载struts.properties
 【5】加载自定义的初始化类,一般不写
 【6】加载初始化参数
 【7】给对象起别名

一般关注上面三个。我们一般只写struts.xml
Struts-default.xml里配置的拦截器。
Default.properties默认已配置所有的常量,根据需求可以在struts.properties,web.xml,struts.xml配置文件里配置常量

2.请求到来
这里写图片描述

四、配置详解

sturts.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">

<!-- 配置action -->
<struts>
      <package name="demo" extends="struts-default" namespace="/">
           <action name="demo" class="com.itheima.test.ActionDemo">
                 <result name="success" type="redirect">/other.jsp</result>
           </action>
      </package>
</struts>

4.1package解释

package:一个package就是一组业务的集合,package: 用于表示一组业务,里面的action表示一个请求动作, 主要方便维护、以及struts 能够快速找到具体的类
* name:表示package的别名,一般不建议重复,我们针对用户的操作有很多请求 。 用户的添加 、 用户的删除 、用户的修改…
* extends,这个package继承指定的package,struts-default 这也是一个package,这里面包含了很多的拦截器,一般我们都会使用到这些拦截器。这个struts-default 其实是 框架里面有一个 struts-default.xml 里面有声明一个package ,名字就叫struts-default ,这里写上extends其实是跟它形成一种关系。
* namespace:命名空间,直接写/表示根目录,表示在根目录下面再加入一个自路径,用意就是在根目录下面再加一个子路径才能访问到action。默认是空串的值

4.2action解释:

一个动作就是一个action,就是一个请求配一个action,和以前的一个请求配置一个servlet相似,
如上述访问的时候就是–工程名/demo 或者是 工程名/demo.action,action是默认的后缀名,可以通过配置文件进行配置的。
* name就是别名,一般就写方法名或者这个动作的名称
* class,action的全路径地址
* method:访问这个action中的某个方法,推荐使用通配符方式(告诉struts框架,找到那个类之后,执行什么方法)

4.3 result:

执行完结果之后,返回什么结果给浏览器,这个result 可以重复配置,但是name 不要一样, 保证一对一的关系。 之所以能够配置多个result,
那是因为我们在执行某个方法之后,可能会产生多种结果,我们需要针对每一种结果都进行判定。
name就是action的方法返回值,struts会拿着方法的返回值过来找到匹配的result,从而进行页面的跳转(一个action可以配置多个result,因为有可能执行会有多种结果出现)
默认情况走的是请求转发,type=‘redirect’表示重定向
结果还是可以跳转action的(去看看官方文档。)

  <result name="success" type="redirect">/other.jsp</result> 
  使用重定向跳转到other.jsp
  <result name="error">/login.jsp</result> 
  使用请求转发跳转到login.jsp

五、Action的通用写法

1)普通类的方式
2)实现接口Action
3)继承ActionSupport类(推荐)

5.1采用普通类写法

        public class ActionDemo {
            public String execute(){
                System.out.println("execute333 ~~~~");
                return "success";
            }
        }

5.2采用实现Action接口方式

import com.opensymphony.xwork2.Action;

public class ActionDemo2 implements Action {

      @Override
      public String execute() throws Exception {
           System.out.println("execute2222执行了~~~");
           return SUCCESS;
      }
}

5.3采用继承ActionSupport方式

未来写action都采用这种方式去做。 因为它除了实现接口,提供了一些常量之外,还额外实现了其他接口。 我们可以轻而易举的使用他们来完成一些数据回显 、 国际化的功能。

      import com.opensymphony.xwork2.ActionSupport;

      public class ActionDemo03 extends ActionSupport{

            @Override
            public String execute(){
                System.out.println("actionDemo03 execute ~~");
                //登陆失败 --》request.setAttribute("msg","用户名或者密码错误了~");
                addActionError("用户名或者密码错误了");
                return SUCCESS;
            }
        }

六、Action的访问策略

主要讲解的就是访问除了execute方法之外的其他方法。
1)使用method属性匹配
2)采用通配符访问Action方法(推荐使用)
3)采用动态方法访问开关

6.1使用method属性匹配

method里面直接写方法的名字即可,这个时候,就能执行一个你的方法了。
缺点:死板,一个action这样只能调用一个方法

        public class ActionDemo extends ActionSupport{
            public String add(){
                System.out.println("访问了add方法~~~");
                return SUCCESS;
            }
        }

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">

<!-- 配置action -->
<struts>
      <package name="demo" extends="struts-default" namespace="/">
           <action name="demo" class="com.itheima.test.ActionDemo3" method="add">
                 <result name="success" type="redirect">/other.jsp</result>
           </action>
      </package>
</struts>

6.2采用通配符访问 Action方法【推荐使用】

解决了一个Action有多个方法的时候,我们需要配置多个Action标签的问题。 ,现在只需要配置一个action标签即可,然后采用 * 通配符的方式起来访问action的方法

       public class ActionDemo extends ActionSupport{
            public String add(){
                System.out.println("访问了add方法~~~");
                return "add_success";
            }
            public String update(){
                System.out.println("访问了update方法~~~");
                return "update_success";
            }

        }

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">

<!-- 配置action -->
<struts>
      <package name="demo" extends="struts-default" namespace="/">
        <action name="demo_*" class="com.itheima.test.ActionDemo3" method="{1}">
             <result name="success" type="redirect">/other.jsp</result>
        </action>
      </package>
</struts>

6.3采用动态方法访问【不推荐使用】

  1. 打开动态方法访问开关
    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">

<!-- 配置action -->
<struts>
      <!-- 打开动态访问的开关 -->
      <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
      <package name="demo" extends="struts-default" namespace="/">

           <action name="demo" class="com.itheima.test.ActionDemo3">
                 <result name="add_success" type="redirect">/other.jsp</result> <!-- 添加成功 删除成功 -->
                 <result name="update_success" type="redirect">/other.jsp</result> <!-- 添加成功 删除成功 -->
           </action>
      </package>
</struts>

2.直接访问action
localhost:8080/项目名/demo!add —> action名称 + ! + 方法名

小结:Struts使用步骤:

1)导入jar包到lib文件夹中
2)配置web.xml,配置里面的filter属性(前端控制总站)
3)配置struts.xml,配置具体的action的映射
4)编写Action

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值