我爱编程

00-struts入门

2018-06-21  本文已影响22人  何惧l
  1. 基本配置
  2. 关于方法调用 action
  3. 转发与重定向 result

基本配置

  1. 新建一个Web动态项目struts
  2. 导入需要的jar包,复制到WEB-INF/lib下
    链接:https://pan.baidu.com/s/1p9YbyjWINLnQHD0Qw4yopg 密码:u8wh
  3. 在web.xml文件中
    • 配置一个Filter,所有的请求都给过滤给org.apache.struts2.dispatcher.ng.filter下的StrutsPrepareAndExecuteFilter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <filter>
    <!-- 给过滤器程序设计一个匿名 -->
    <filter-name>mystruts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
    <filter-name>mystruts</filter-name>
    <!-- 指出访问路径对应的匿名的路径 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

  1. 创建一个处理类
    • 创建一个包,action,创建一个类TestAction,写一个方法
    • 一会配置完成后执行的就是这个方法
package action;

public class TestAction {
    public String test() {
        System.out.println("public: test....");
        return "mystruts";
    }
}


  1. 配置struts.xml
    • 在src目录下创建一个struts.xml文件,下面是最简单的配置信息
    • 效果是当访问test路径的时候服务器跳转到NewFile.jsp
<?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标签:用于创建一个包,实现Action在逻辑上的包装,类似于java中的包
    namespace属性:设置命名空间,类似servlet注册中的虚拟目录默认为'/'
    extends属性: 设置当前的继承指定的包,通常就继承这个包`struts-default`
     -->
    <package name="strutstest" namespace="/" extends="struts-default">
    
    <!-- action标签:创建一个业务标签,实现请求一个Action的映射
        name属性:设置一个请求名,也就是你访问的路径
        class属性:指出当前action处理类,属性值为类全名
        method属性:指出处理类中的那个方法处理当前的请求
     -->
        <action name="test" class="action.TestAction" method="test">
        <!-- result标签:创建一个响应映射,实现视图名到视图
        name属性:属性为视图名,当试图类的处理方法返回的试图名与当前name值相同时,返回
        这个视图
        type属性:设置响应试图文件的方法,响应方式,默认是转发
        -->
            <result name="mystruts">/NewFile.jsp </result>
        </action>
    
    </package>


</struts>   
    
  1. 在NewFile.jsp就写一句,然后启动,访问http://localhost:8080/struts/test
    此时上面那个方法就会执行了,也访问了这个视图
  1. 整体流程

    • 所有的访问都会被web.xml中的配置的Struts的Filter所拦截
    • 拦截之后就会进入到struts的工作流程
    • 访问的地址是/test,根据struts按照struts.xml中的配置,服务器跳转到NewFile.jsp
    • 显示NewFile.jsp页面
  2. 注意事项

    • struts2的配置文件必须是struts.xml
    • 这个配置文件必须在src下面
  3. struts.xml中搜索
    多级搜索:

    • struts.xml 针对请求路径映射规则为:先根据命名空间搜索package标签,当找到包之后根据action名搜索action标签
      包搜素:
    • 若根据原命名空间找不到package标签,struts2自动后退一层目录,然后将新目录作为命名空间,寻找package标签,以此类推,找到package将不再寻找,否则报错
      action搜素:
    • 根据action名若在当前包中找不到相关的action标签,自动到默认包中(namespace为空白就是/根目录)中找到相关的action标签,若没有就报错

先执行包多级搜素在进行action多级搜索,它们是独立的

关于方法调用 action

  1. 占位符的方式
    • 首先是在action中定义好方法
package action;

public class TestAction {
    public String test() {
        System.out.println("public: test....");
        return "mystruts";
    }
    public String select() {
        System.out.println("public: select....");
        return "mystruts";
    }
    public String insert() {
        System.out.println("public: insert....");
        return "mystruts";
    }
    public String update() {
        System.out.println("public: update....");
        return "mystruts";
    }
    public String delete() {
        System.out.println("public: delete....");
        return "mystruts";
    }
}

<?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>
    <!-- 占位符:调用action类中的方法,name = action_* method="{1}" ,这里面的值就是*代表的值-->
    <package name="strutstest3" extends="struts-default">
        <action name="test_*" class="action.TestAction" method="{1}">
            <result name="mystruts">/NewFile.jsp</result>
        </action>
        
    </package>
</struts>   


<body>
<!-- 占位符 -->
<a href="test_insert">增加</a>
<a href="test_update">更改</a>
<a href="test_delete">删除</a>
<a href="test_select">查询</a>
</body>
  1. 动态调用
    • action中定义的方法不变
    • 在struts.xml中进行配置,其中action中不用指定方法
    • 但是要设置这个属性为true
<?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>
    <!-- 必须设置这个属性为true-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <!-- 占位符:调用action类中的方法,name = action_* method="{1}" ,这里面的值就是*代表的值-->
    <package name="strutstest3" extends="struts-default">
            <!-- 动态调用  方法名不用指定了 -->
        <action name="test" class="action.TestAction">
            <result name="show">/NewFile.jsp</result>
        </action>
    </package>
</struts>   


<body>
<!-- action路径 ! 方法名 -->
<a href="test!insert">增加</a>
<a href="test!update">更改</a>
<a href="test!delete">删除</a>
<a href="test!select">查询</a>
</body>

转发与重定向 result

result标签 : 定义指定视图对应的响应自愿[视图名与视图文件的映射]

  1. name属性:设置当前result标签代表的视图名,默认为sucess

  2. type属性:设置响应视图文件的方式[响应方式],默认为dispatcher转发

    • dispatcher:可以转发到指定的页面
    • chain:可以转发到同包或异包中的action
    • redirect:可以重定向到指定页面或同包\异包action
    • redirectAction:可以重定向到同包或异包的action
  3. 转发的时候指定到action,第一个标签是找到根目录,然后再找到action名为select的

<action name="delete" method="delete" class="com.md.Action.YirenAction" > 
            <result name="delete" type="chain">
                <param name="namespace">/</param>
                <param name="actionName">select</param>
             </result>
            <result name="error">/error.jsp </result>
            
        </action>

上一篇 下一篇

猜你喜欢

热点阅读