什么是Struts框架
Struts2框架是用来替代servlet和jsp 。他的功能就会处理访问服务器的请求。
Struts2框架的优点
1. 接受参数(自动封装参数)
2. 参数的校验
3. 可以控制页面的跳转
4. 防止表单数据重复提交
5. 显示等待页面
历史
Struts2和Struts1 在技术层面讲他们没有任何关系技术使用webwork
这个公司的技术
Struts框架搭建
1. 导包
官网下载Struts2
Struts2开发商没有将这个jar进行分类,所以我们导包很难所以进入导app文件下
这个文件下是一些war包,这些war都是demo,将war包当中的包全部复制出来就是我们要用的包。将Struts2_blank.war改为.rar文件然后解压 然后将web-info下面的lib包全部导入到项目中,就完成了导包



2. 创建Action类
public String hello(){
System.out.println("hello Struts2");
return "success";
}
3. 创建配置文件strutsx.ml
(1)文件位置 必须在 src目录下 名字也必须是struts.xml
导入约束
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
然后在引入Struts 标签
(2)配置actyion
<struts>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="helloAction" class="cn.hd.hello.HelloAction" method="hello">
<result name="success">/hello.html</result>
</action>
</package>
</struts>
(3)创建一个hello.html
(4)在web.xml 中去配置文件。这是因为Struts2是基于过滤器配置过滤器的类名比较长,打开编译器的全局搜索(按两下shift)输入StrutsP就可以了 复制这个类的相对路径
<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>
(5)测试
在浏览器中输入
页面上显示内容为hello.xml中内容,控制台打印hello struts2内容
总结:404错误
1. struts.xml 文件位置方错了
2. struts.xml 文件名字写错了
3. hello.xml 文件文职方错了
4. tomcat 启动失败了
5. struts.xml中配置写错了
一个package中的namespace和地址中不一致
action中的name和地址中的helloAction不一致
result里面的name字段和action中的返回值不一致
reslst中值不是、hello.xml 写错了
配置文件详解
1. struts.xml


(1)package
<!--
package:他跟项目里面的包没关系,他是用来管理action
name:给这个package起个名字没什么意义 可以随便命名,一般情况下
他的命名是按照当前package管理action的分类来命名package和package的
名字不能重复
namespace;访问路径地址前缀跟name没关系 跟其他的package中的
namespace能不能重复,没有要求
extends:继承自struts-default 必须写 名字不能改从 struts2核心包
中struts-2.2-core下面的struts-default.xml这里面配置了很多默认的属性
abstract:抽象 成名的一个标志,当前的配置文件不能独立运行,等
待被继承
-->
<package name="hello" namespace="/hello" extends="struts-default">
(2)action
<!--
action配置详解
name:给action起个名字,决定了访问路径最后的地址
class:类的完整路径名
method:访问类中的方法
-->
<action name="helloAction" class="cn.hd.hello.HelloAction" method="hello">
(3)result<!-- result
name对应的是action类中的method的返回值
名字可以随便写只要和action类中的返回值结果一样就可以
但是一般情况表使用特定
type:dispatcher转发
redirect 重定向
标签中的值:跳专业面的地址
-->
<result name="success" >/hello.html</result>
(4)include在src struts.xml可以去读取其他位置的xml配置文件要求 新创建 的xml必须也有约束
<include file="cn/hd/dynamic/struts01.xml"></include>
常量配置
默认的常量配置在struts2的核心包下的org
默认常量配置的文件名是default.propertites
如何修改这些常量
(1) 在struts.xml中去修改
<!--il8n 国际化 相当于就我们在servlet中设置的编码
解决的post请求的中文乱码
-->
<constant name="struts.i18n.encoding" value="utf-8"></constant>
(2)在src目录下创建 struts.properties文件直接在该文件中去修改常量即可
(3) 在web.xml文件中去修改 添加一个context-param。在param-name中
书写常量名,在param-value中书写常量值
三个地方可以同时修改那个生效?
web.xml>struts.properties>struts.xml
推荐使用第一个
常用的常量
(1) il8n.ecoding 设置编码 解决了post请求的乱码问题
name="struts.i18n.encoding" value="utf-8"
(2)
struts.action.extension设置action的访问扩展名
<!--
extension 使用设置action访问的扩展名
action
可以改成do 为什么要改成do 因为struts1用的是do如果改成do那么在访问路径中必须加上.do否则会有404
-->
<constant name="struts.action.extension" value=""></constant>
(3)struts.devMode设置开发者模式 默认关闭
<!--developerMode 发开这模式
1.热部署 你修改配置文件后,等一段时间会自动加载
2.提高错误信息的提示(友好的错误提示)
-->
<constant name="struts.devMode" value="true"></constant>
高级配置
为什么使用动态方法?简便
(1) 推荐使用
<action name="userAction_*" class="cn.hd.dynamic.UserAction" method="{1}">
<result name="success">/hello.html</result>
</action>
action配置中的name属性决定着浏览器的访问地址
struts2可以采用通配的方式默认去读取menthod{1}会自动将路径中userAction。。。配置到mehtod中
(2) 开启动态方法
首先要开启动态方法的常量
<!--动态方法调用的常量 默认是关闭的-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
将action中的method删除掉
完成了动态方法的开启
测试时候在浏览器的路径中 输入action的name值+!+方法名(action中的方法名)
注意:
第一种方法 在struts2的高版本中会无效
首先你也要开启动态方法,然后增加allowed-methods属性
<action name="userAction_*" class="cn.hd.dynamic.UserAction" method="{1}">
<result name="success">/hello.html</result>
<allowed-methods>update,add,delete,show</allowed-methods>
</action>
默认配置(了解)
<!--
method 属性可以不写默认方法 execute
result 标签中的name属性可以不写 默认找success
type 可以不写 默认是dispatcher
class 可以不写默认的类是ActionSupport 打开这个类文件
它里面有execute方法 ,该方法返回一个success字符串
-->
<action name="defaultAction">
<result>/hello.html</result>
</action>
<!--
默认的action地址
如果请求地址不存在,那么会默认访问default-action-ref里面的action
-->
<default-action-ref name="defaultAction"></default-action-ref>