初次使用Struts2/入门

步骤:

1.下载jar包

在这里插入图片描述
官网:https://struts.apache.org/

其他所需要的jar包

  • commons-fileupload.jar:文件上传组件
  • commons-io是一款处理io流的工具,封装了很多处理io流和文件的方法,可以大大简化我们处理io流和操作文件的代码
  • commons-lang3跟java.lang这个包的作用类似,Commons
    Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。
  • freemarker-2.3.26.jar:struts2的UI标签的模板使用FreeMaker编写
  • Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。
  • Log4j 是Apache为Java提供的日志管理工具。他与System.out.println()的作用相似,用来跟踪、调试、维护程序。
  • ognl.jar:对象图导航语言(struts2通过ognl读写对象的属性)
  • struts2的核心类库
    如图
    在这里插入图片描述

2.引用至本地项目

  • 准备好了上面所有的jar包之后,我们把这些jar包导入到自己的项目中去

    如图
    在这里插入图片描述

3.新建source folder 放入struts.xml 配置web.xml

  • 如图:

在这里插入图片描述
在这里插入图片描述

  • web.xml代码:

     <display-name>Struts Blank</display-name>
    
     <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>
    
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>
    

struts代码:

<struts>

<!-- consant 常量,struts.devMode表示开发者模式,当为true时如果改变了其中的一些代码,可以不用重新启动tomcat-->
<constant name="struts.devMode" value="true" />

<!--package可以有多个解决重名的情况, namespace 可以不写,默认是如何路径都可以,也可以写成/xx/yy ,必须是/开头-->
    <package name="default" namespace="/" extends="struts-default">

       <default-action-ref name="index" />

       <global-results>
           <result name="error">/error.jsp</result>
       </global-results>

       <global-exception-mappings>
           <exception-mapping exception="java.lang.Exception" result="error"/>
       </global-exception-mappings>

<!-- action里面那个name属性值得是URL输入的路径名 ,如“http://localhost:8080/Struts2Demo/hello”,则会根据result反馈Hello.jsp-->
       <action name="hello" class="com.styspace.struts2.action.action2">
           <result>  /Hello.jsp</result>
       </action>

<!-- action里面class属性值,会有对应的这个类,执行该类里面的execute()方法-->

       <action name="action" class="com.styspace.struts2.action.action2">
           <result name="success">/Action.jsp</result>
       </action>

<!-- action里面method属性值,会有对应class这个类中的add方法,然后执行该方法-->

<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 一般action里面不用method属性值,而是用DMI(动态方法调用)可以通过http://localhost:8080/Struts2Demo/user!addURL调用,其中user指的是action中的name值-->
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 更简单的方法,通配符,name=“student*”会匹配URL中所有Studentxx,而method=“{1}”指的是name中第一个“*”匹配的值 同理,result中{1}也是一样的-->


        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

            <result>/Student{1}_success.jsp</result>
        </action>
<!-- 甚至可以有多个通配符,class属性中也可以用{1}来匹配,最简化-->
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>


    </package>
    <!-- Add packages here -->

</struts>

4.新建一个子控制器

  • 列如:一个名为HelloAction的子控制器

    
    private String result;
    
    public String getResult() {
    	return result;
    }
    
    public void setResult(String result) {
    	this.result = result;
    }
    
    public String execute() {
    	System.out.println("滑稽");
    	return "rs";
    }	 }
    
    
    
    
  • struts配置:

在这里插入图片描述

  • jsp跳转:

在这里插入图片描述

工作原理:

  1. 在浏览器中输入http://localhost:8080/Struts2Demo/hello,就会向服务器端(tomcat)发送一个请求

  2. tomcat会解析URL,从中找到一个webApplication(可理解为即项目名)为Struts2Demo,然后就会在这个项目里面找到web.xml文件

  3. 在web.xml中找到filter标签,然后在filter中定义的filter-class处理URL中的hello(这其中其实还包含一个步骤,就是web.xml中/*会过滤掉所有地址,这样地址才会被filter-class中定义的类接收到)

  4. StrutsPrepareAndExecuteFilter接收到地址之后,首先查询namespace(在struts.xml中的package标签中的namespace中得到它的值),然后将URL中namespace值(这里是/)后面的路径读取到(这里是hello)

  5. 继续在struts的action标签中查找是否有hello这个值的,如果有且发现action中有class属性,则会new一个class中声明的类,执行里面的一个execute()方法,该方法返回一个String字符串,返回该字符串之后才能得到result中的值,如果action中没有class属性,则默认有一个ActionSupport类,该类中也有一个execute方法,返回一个String值

  6. 上一步中讲到execute()方法,但是不一定非要执行execute()方法,当action标签中有method属性时,就会执行该属性定义的方法名称,然后同样会返回一个String字符串

  7. 根据返回的String字符串(success),在result中找到name属性值为返回的String字符串的标签(这里就是Action.jsp),如果没有找到,则会返回error页面;如果action中没有class则直接找到该action下面的result中的值(这里是/Hello.jsp),然后将请求forword到Action.jsp/Hello.jsp

  8. 最后jsp反馈到客户端。

jsp展示结果:

在这里插入图片描述

初步使用建立一个Hello Word页面完成了

如果你在struts.xml标签校验失败没有提示怎么办?

Look!看下面在这里插入图片描述

  1. 首先在Libraries下面找到 struts2.5.dtd

在这里插入图片描述

  1. 然后在本地新建一个struts2.5.dtd(代码使用高级记事本copy进去就可以了)

在这里插入图片描述

3.进入window→preference→输入xml
在这里插入图片描述

4.点击add会出现这个界面
在这里插入图片描述

  • 先选中本地我们新建的dtd文件,然后输入uri,然后我们回到struts.xml里就会出现提示了

结果:

在这里插入图片描述

XML Catalog 原理

XML Catalog 提供了一种重新定位资源的机制,可以将 xml 引用的 artifacts,包括 URI 地址以及 namespace 名重新定位到另一个地址。通常这种机制被用来将远程的引用资源重定位到本地或者 web。XML catalog 就是一个描述外部实体引用和本地缓存的相同实体的映射的文件。

在实际的开发生产中,xml 文件经常会引用外部的文件,这些文件通常通过 URI 表示,其中以 URL 应用最广。但是如果是绝对的 URL, 那么只有当你的网络能够访问它时才能起作用,如果网络出现问题,那么将不能访问。当是相对 URL 时,例如"…/…/xml/dtd/docbookx.xml",只有当你的文件系统和定义者一致的时候才能起作用。

一种解决办法就是通过实体解析器(Entity Resolver)或者是 URI 解析器 (URI Resolver ),解析器可以通过检查资源的 URI 来定位资源。 用户通过配置 xml catalog, 手动的指定 xml 文件引用的 xsd 文件的本地地址,URI 解析器通过 xml catalog 里面的映射,找到对应的 xsd, 最后 xml catalog 处理器通过解析器找到的 xsd 对 xml 进行校验。

通俗点说,XML catalog 通过命名空间将 xml 文件及其对应的 xsd 文件联系起来,并通过解析器定位 xsd 文件的位置,最后通过处理器进行校验。

与 javax.xml.validation 通过 xsd 对 xml 进行校验的方法不同,xml catalog 可以通过 Namespace 来校验所有引用这个 xsd 的 xml 文件,从而达到批量校验的效果。例如,a.xml,b.xml,c.xml 都是由 d.xsd 校验,那么只要将 d.xsd 的命名空间配置好,通过该命名空间就可以校验以上三个文件了。

5.参数赋值方法

  • 赋值方法分为三种:

    1.在Action内为某一属性提供set/get方法

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.implements ModelDriven接口客户端页面的值会通过反射赋值

    在这里插入图片描述
    在这里插入图片描述

    3.对象导航赋值

    这里是用对象实例的name.属性
    在这里插入图片描述

  • 对象导航需要对对象进行封装

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/INori_2023/article/details/83002567