1.什么是Struts2框架?
Struts2框架是用来替代servlet和jsp 他的功能就是访问服务器的请求、
2.Struts2框架的优点
1. 接受参数(能自动封装)
2. 参数的校验
3. 可以控制页面的跳转
4. 可以防止表单的数据重复提交
5. 显示等待页面
3. 历史
Struts2,Struts1 在技术层面讲他们没有任何关系。技术使用的webwork这个公司的技术。
创建Action类
public class HelloAction {
public String hello(){
System.out.println("hellostruts2");
return "success";
}
}
3创建配置文件 struts.xml
(1)文件位置必须在src目录名字也必须是struts.xml
导入约束
约束文件 xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
然后在引入struts标签
(2)去配置 action
(3)创建一个hello.html
(4)web.xml 中去配置过滤器 这是因为struts2是基于过滤器1
配置过滤器的类名比较长 打开编译器全局搜索 输入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>
</web-app>
总结 404 错误
1、 struts.xml文件位置放错了
2、 struts.xml文件名字写错了
3、 hello.xml文件位置放错了
4、 Tomcat启动失败
5、 Struts.xml中配置写错了
(1) package 中的namespace和地址中的不一致
(2) action中的name和地址中的helloAction不一致
(3) result里面的name字段和action中的返回值不一致
(4) result中值不是/hello.html 写错了
配置文件详解
1.strtus.xml
Namespace对应的地址。
package
:它跟项目包没有关系 它是用来管理action name 给这个package起名字 没有特别含义 可以随便命名 一般情况下他的命名是按照当前packgae管理action的分类来命名package 和package的名字不能重复 namespace:访问路径地址前缀 跟name 没有关系跟其他package中的namespace能不能重复 没有要求 extends:继承 继承自struts-default 必须写名字不能改。 固定写法 从struts 核心包中struts-2.2-core下面的 struts-default.xml 这里面配置了很多默认的属性 abstract :抽象的意思 声明的一个标志 当前这个配置文件不能独立运行 等待被继承 action配置 <action name="helloAction" class="ch.hd.hello.HelloAction" method="hello"> <result name="success" type="redirect">/hello.html</result> <!--result name对应的事action类中的method返回值 名字可以随便写 只要和action类中的返回值结果一样就可以 但是一般情况下使用特定 type:dispatch 转发 redirect 重定向 标签中间 的值:跳转页面的地址 --> </action>
2.常量配置
默认的常量配置在struts2的核心包下的
默认常量配置的文件名是default.propertites
如何修改这些常量
(1)在struts.xml中去修改
<!--i8n 国际化 相当于我们在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)设置编码 解决了post 请求的乱码问题
<constant name="struts.i18n.encoding"value="utf-8"></constant>
(2)struts.action.extension 设置action的访问扩展名
(3)developerMode 开发者模式 默认关闭 1.热部署 你修改配置文件后 等一段时间会自动加载 2.提高错误信息的提示(友好的错误提示) <constant name="struts.devMode" value="true"></constant>
3.高级配置
为什么使用动态方法
简化代码量更方便
如果配置动态方法
(1)推荐使用
<action name="userAction*"
class="ch.hd.dynamic.UserAction"
method="{1}">
<result name="success">/hello.html</result>
</action>
Action配置中的name属性 决定着浏览器的访问地址
Struts2 可以采用通配符的方式默认去读取method{1}会自动将路径中userAction….配置到method中。
(2)开启动态方法
首先要开启动态方法的常量
<constant name="struts.enable.DynamicMethodInvocation"value="true"></constant>
将action中的method 属性删除掉
完成了动态方法的开启
测试的时候 在浏览器的路径中 输入action 的name值+!+方法名(Action中的方法名)
注意:
第一种方法 在struts2的高版本中会无效
首先你也要开启动态方法,
4.默认配置
访问流程
3.struts2过滤器去加载配置文件struts.xml
4.路径中的第一个地址 namespace 遍历你的stuts.xml中package namespace属性如果他找到了和地址中匹配的就进入到该包,如果没有找到就报异常
5.找到了package 再去路径后面的地址 然后去package找action的name属性如果找到匹配的 就进入到action配置的Action类中
6.通过action 的method 属性去执行Action对应的方法
7.根据执行的Action类中的方法获得返回值 然后回到struts.xml里面的result标签 通过读取result中的配置打开对应的页面】
Action类的创建
总共有三种方式
1.pojo类
2.实现action类
3.继承ActionSupport类(推荐)
注意:action里面的方法末班是固定的权限 :pulibc 返回值类型:String
方法中不允许有参数
页面的跳转方式
1.转发
2.重定向
3.转发到自己的action 变为chain
4.重定向action type变为redirectAction
5.不跳转接收ajax请求
(1使用原生的servlet Api)
ActionContext在struts2中 我们把它叫做数据中心
Requset 原生对象
Response原生对象
Session 原生对象
ServletContext 原生对象
Attr 域 Map
Requset 域 Map struts2不建议使用 如果要使用就用ActionContext对象
Session 域 Map
ServletContext App lication 域 Map
ActionContext 生命周期
所有的servlet的对象都存了,他的生命周期是随着其中最短的人而创建和销毁 也就是request对象 ActionContext 都会重新创建
所以他解决了 线程安全的问题
使用servletApi响应ajax请求
1.获得response对象(2种方法)然后回到原生态servlet响应中
2.action中的方法值必须是NONE (如果设置NONEname在struts.xml中就不用书写result标签了)
(2 stream)
1.在Action类中创建一个InputStream对象
2.给这个对象增加一个get方法
3.struts.xml中的result标签中设置type=stream
4.Action 最终可以将json字符串转化为InputStream
(3 使用json插件)
1.导包
2.建立一个Action类
定义你想返回的json的键名
生成get set方法
然后在Action 访问的方法中为这个json键名的对象进行赋值
3.配置struts.xml文件
重新建package extedns 继承不能写struts-default 要写json-default
(在struts-json-plugin 包的struts-plugin-xml中)
Action 不变
Result name属性不变 type变为json (在struts-json-plugin包的struts-plugin.xml中)
参数的接收
1.属性驱动
原因:struts2是线程安全
在Action类中直接定义属性名然后设置get set方法
在访问的地方传入对应属性名和值 struts2自动接收
2.对象驱动
定义一个bean类
在Action定义一个对象并且加上get set方法
并且在请求的地方请求参数 键值有规定必须按照规定的对象名.属性名的方式传递
3.模板驱动
实现 ModuleDrive<User>接口
重写方法
在Action中创建一个user对象并且要new对象
请求的地方还是按照对象属性传递。