刚启动idea 就报出错误 

[2019-04-14 03:08:22,780] Artifact 05-sturts2:war exploded: Error during artifact deployment. See server log for details.

解决办法:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

file-project structure -probleam 里面有一个fix

第二个错误:

就是需要的jar包没有加全

这几个是创建idea 时自带的jar包,我使用的jar包是5版本的
commons-fileupload.jar commons-io.jar commons-lang.jar freemarker.jar log4j.jar ognl.jar struts2-core.jar

这个时候运行报错

需要再添加上几个jar包

asm-5.2.jar
asm-commons-5.2.jar
asm-tree-5.2.jar
commons-lang3-3.8.1.jar
javassist-3.20.0-GA.jar

这个时候idea 自动生生的sturts.xml文件是标错的

idea的配置文件扫描的类是

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

但是新的jar包中去掉了ng这个包,所以只需要改成下面的就可以了。学完springmvc后再看sturts2 真是挺简单的。

org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

 

下面对jar包进行一下分析

 

 
asm-5.2.jar asm-commons-5.2.jar asm-tree-5.2.jar 红色的是用于实现代理的主要jar包
javassist-3.20.0-GA.jar
 commons-lang3-3.8.1.jar javassist-3.20.0-GA.jar
commons-fileupload.jar
commons-
io.jar 文件上传
commons-lang.jar 这个是定义的基本数据类型以及对它的扩展
freemarker.jar stutrs2 的ui
log4j.jar 日志
ognl.jar 对象图导航语言,是一种表达式是一个独立的项目是被sturts2引进来的
struts2-core.jar 核心jar包

X先放上一个简单的例子
jsp

sturts2 入门笔记 随笔 第1张
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2019/4/14
  Time: 15:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form name="f1" action="loginaction/login.action" method="post">
   姓名: <input type="text" name="name"/>
   年龄: <input type="password" name="password"/>
     <input type="submit" value="提交"/>

  </form>
  </body>
</html>
index.jsp

sturts.xml

 

sturts2 入门笔记 随笔 第3张
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="loginaction" namespace="/loginaction" extends="struts-default">
        <action name="login" class="com.sturts2.action.loginAction">
            <result name="success">/welcome.jsp</result>

        </action>
    </package>
    
</struts>
sturts.xml sturts2 入门笔记 随笔 第5张
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2019/4/14
  Time: 15:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

name =${name}
password = ${password}
</body>
</html>
welcome.jsp

需要注意的地方就是你的表单的属性名 name 必须要和你的实体类中的名字相同

讲解一下配置文件的加载顺序

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>      表单中的action中的地址就是loginaction/login.action 也就是名称空间加上 标签<action>中的name 从而找到要加载的试题类loginAction ,如果没有在
<action>标签中指定method 那么 所执行的action 方法 也就是 execute 这个名字不能变否则找不到
必须要写成 public String execute(){ return "success"} 否则不会执行 正好对应标签中的 <result>标签中的success
<package name="loginaction" namespace="/loginaction" extends="struts-default"> <action name="login" class="com.sturts2.action.loginAction"> <result name="success">/welcome.jsp</result> </action> </package> </struts>

 

struts.properties 文件修改默认配置

sturts2 入门笔记 随笔 第7张

 

 struts.xml 修改访问路径的后缀名   

action="loginaction/login.do"   
action="loginaction/login.php"
action="loginaction/login.html"
struts.action.extension=do,php,html

 

web.xml 和struts.properties 和struts.xml 相比谁的优先级比较高

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>do</param-value>
    </init-param>
    
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.action.extension" value="go"></constant>
    <package name="loginaction" namespace="/loginaction" extends="struts-default">
        <action name="login" class="com.sturts2.action.loginAction">
            <result name="success">/welcome.jsp</result>

        </action>
    </package>
    
</struts>

 

 

运行后可知,web.xml>struts.properties>struts.xml

但是我们一般不在web.xml 或者struts.properties中进行设置。

 

struts.xml包命名问题

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.action.extension" value="go"></constant>
    <package name="aaa-bbb-loginaction" namespace="/aaa/bbb/loginaction" extends="struts-default">
        <action name="login" class="com.sturts2.action.loginAction">
            <result name="success">/welcome.jsp</result>

        </action>
  <package name="aaa-loginaction" namespace="/aaa/loginaction" extends="struts-default">
        <action name="login" class="com.sturts2.action.loginAction">
            <result name="success">/welcome.jsp</result>

        </action>
</package> </struts>

一般如果我们有多个package 那么package 中的name 与namespace都是相对应的

name="aaa-bbb-loginaction" namespace="/aaa/bbb/loginaction"
 name="aaa-loginaction" namespace="/aaa/loginaction"
而且,namspace中也可以不写但是namespace中至少要写上/
 

接下来添加配置文件的属性

<package name="register" namespace="/registeraction" extends="struts-default">
        <action name="register" class="com.sturts2.action.RegisterAction" method="register">  加上这个就意味着我们可以自定义方法名而不是execute
            <result name="success">/register.jsp</result>

        </action>
    </package>
我们默认的页面是进行转发
<result type="dispatcher" name="success">/register.jsp</result>

下面是进行重定向
<result type="redirect" name="success">/welcome.jsp?uname=${name}&amp;upassword=${password}</result>

 还有另外一种写法

 <package name="loginaction" namespace="/loginaction" extends="struts-default">
        <action name="login" class="com.sturts2.action.loginAction">
            <!--<result name="success">/welcome.jsp</result>-->
           <!-- <result type="redirect" name="success">/welcome.jsp?uname=${name}&amp;upassword=${password}</result>-->
            <result type="redirectAction" name="success">
                <param name="actionMapper">actionName</param>
               <param name="uname">${uname}</param>
               <param name="upassword">${upassword}</param>

            </result>

        </action>
        <action name="actionName">
            <result name="success">/welcome.jsp</result>
        </action>
    </package>

 

解决配置文件冗余

先看一个例子

<package name="some" namespace="/someAction" extends="struts-default">
    <action name="first" class="com.sturts2.action.someAction" method="doFirst">
        <result name="ar">/apage.jsp</result>
        <result name="br">/bpage.jsp</result>
        <result name="success"> /welcome.jsp</result>

    </action>
<action name="second" class="com.sturts2.action.someAction" method="doSecond">
    <result name="ar">/apage.jsp</result>
    <result name="br">/bpage.jsp</result>
    <result name="success">/welcome.jsp</result>

</action>
    
</package>

这些都是重复的代码下面就是简化

保范围全局视图

 

 

 

 

<package name="some" namespace="/someAction" extends="struts-default">
    <global-results>
        <result name="ar">/apage.jsp</result>
        <result name="br">/bpage.jsp</result>
    </global-results>
    
    <action name="first" class="com.sturts2.action.someAction" method="doFirst">
        <result name="success"> /welcome.jsp</result>
    </action>

    <action name="second" class="com.sturts2.action.someAction" method="doSecond">
        <result name="success">/welcome.jsp</result>
    </action>
    
</package>

继续抽取

<!--这个包不定义action也就不会被访问,所以名称空间也可以省略了那么也可以定义成抽象的,一旦定义成抽象的就不能再定义action-->
<package name="basepackage"  extends="struts-default" abstract="true">
    <global-results>
        <result name="ar">/apage.jsp</result>
        <result name="br">/bpage.jsp</result>
    </global-results>

</package>
    <package name="some" namespace="/someAction" extends="struts-default">
        <action name="first" class="com.sturts2.action.someAction" method="doFirst">
            <result name="success"> /welcome.jsp</result>
        </action>

        <action name="second" class="com.sturts2.action.someAction" method="doSecond">
            <result name="success">/welcome.jsp</result>
        </action>
    </package>

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄