sturts2 入门笔记
刚启动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

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

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

<%-- 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 文件修改默认配置
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}&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}&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>

更多精彩