interceptor是一个拦截器栈 看出来了吗html
web目录下java
---web/WEB-INF/web.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_3_1.xsd" version="3.1"> <!--struts工做原理1 先是配置过滤器 请求过来一系列过滤器 核心是一个StrutsPrepareAndExecuteFilter(以前是FilterDispatcher) StrutsPrepareFilter ExecuteFilter 这两个--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> StrutsPrepareAndExecuteFilter过滤器是这个类 注意 这是一个类 之前是FilterDispather 2.1.3开始 分了两种StrutsPrepareFilter和ExecuteFilter 能够在action执行以前添加本身的过滤器 </filter> <filter-mapping> <filter-name>struts2</filter-name> <!-- -struts工做原理1.1 全部请求都会通过struts2的过滤器 struts2过滤本身相关的 好比.action 若是是.html .jsp就放行--> <!-- -struts工做原理1.2 只有.action后缀的会到ActionMapper请求这里查找 当前请求有没有指定的action 若是有 找到以后会朝上走 回到过滤器StrutsPrepareAndExecuteFilter 而后走到ActionProxy 就像下面--> <!-- -struts工做原理2 而后再往左边走到ActionProxy ActionProxy经过ConfigurationManger读 struts.xml 找到具体的action类--> <!-- -struts工做原理3 经过ActionProxy代理建立action的一个反向的实例 再经历一系列的拦截器执行到Action 返回一个String的Result--> <!-- -struts工做原理4 这个Result对应的就是一个视图 Template 包括jsp freemarker 等等 再通过一系列的拦截器 经过HttpServletResponse返回到用户的实例进行显示--> <url-pattern>/'*'</url-pattern>//这里没办法啊 应该就是/*的 </filter-mapping> </web-app>
---web/WEB-INF/lib
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.3.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.24.1.jar
xwork-core-2.3.24.1.jarweb
---web/WEB-INF
---result.jspapache
<%@ page contentType = "text/html;charset=UTF-8" language = "java" %> <html> <head> <title></title> </head> <body> This is result.jsp </body> </html> http://localhost:8080/HelloWorld/helloworld.action 能够看到 struts2中Action的execute方法 是没有传入 HttpServletRequest和 HttpServletResponse对象的 @Override public String execute() throws Exception { System.out.println("执行Action"); return SUCCESS; } struts2提供了三种方式访问Servlet Api 1.ActionContext 2.实现***Aware接口 3.ServletActionContext http://localhost:8080/HelloWorld/aaa/aaaa/helloworld.action这样也能够...这是为何? //若是要能够 namespace不该该改为/aaa/aaaa/吗 //找到/最后一级 找到了这个action 因此没有报错 <package name="default" namespace="/" extends="struts-default"> <action name="helloworld" class="HelloWordAction"> //<!-- result后面能够跟name和type的 默认的话 默认的话是SUCCESS--> <result>/result.jsp</result> </action> </package>
这里讲一下Aciton的搜索机制
http:/localhost:8080/sturts/path1/path2/path3/student.action
第一步:判断package是否存在,如:path1/path2/path3/
存在app
第二步:action是否存在 若是不存在则去默认namespace的package里面寻找action
第三步:若是没有,则报错
不存在
第二步:检查上一级路径的package是否存在(直到默认namespace),重复第一步
第三步:若是没有 则报错jsp
3.动态方法调用
为了解决一个Action对应多个请求的处理 以避免Action太多
方法 1.指定method属性 2.感叹号方式 3.通配符方式
1.指定method属性
---HelloWordAction.javaide
public String add(){return SUCCESS;} public String update(){return SUCCESS;}
---struts.xmlpost
<action name="helloworld" class="com.imooc.action.HelloWordAction"> //<!-- result后面能够跟name和type的 默认的话 默认的话是SUCCESS--> <result>/result.jsp</result> </action> <action name="addAction" method="add" class="com.imooc.action.HelloWordAction"> <result>/add.jsp</result> </action> <action name="updateAction" method="update" class="com.imooc.action.HelloWordAction"> <result>/update.jsp</result> </action>
每一个Action xml里面都写一下 也很麻烦测试
2.感叹号方式 不是很建议使用this
public String add(){return "add";} public String update(){return "update";}
<action name="helloworld" class="com.imooc.action.HelloWordAction"> //<!-- result后面能够跟name和type的 默认的话 默认的话是SUCCESS--> <result>/result.jsp</result> <result name="add">/add.jsp</result> //<!-- 这里就不能返回SUCCESS了 而是返回add--> <result name="update">/update.jsp</result> </action> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
而后这么用: http:/localhost:8080/HelloWorld/helloworld!add.action(不加!add是调到result.jsp)
3.通配符方式
<action name="helloworld_*" method="{1}" class="com.imooc.action.HelloWordAction"> //<!-- result后面能够跟name和type的 默认的话 默认的话是SUCCESS--> <result>/result.jsp</result> <result name="add">/{1}.jsp</result> //<!-- 这里就不能返回SUCCESS了 而是返回add--> <result name="update">/{1}.jsp</result> </action>
使用方式
http:/localhost:8080/HelloWorld/helloworld_add.action
还能够这么写 *_* 第一个星号是{1} 第二个是{2}
<action name="*_*" method="{2}" class="com.imooc.action.{1}Action">
这个就是在使用的时候 用大写的helloworld
http:/localhost:8080/HelloWorld/HelloWorld_add_action.action
===============================================================================
<action name="*_*" class="org.itat.zttc.action.{1}Action" method="{2}"> <!-- class类 method方法 User-addInput User对应{1} 对应类(UserAction) addInput对应{2} 对应方法(addInput) 假设传入User_addInput--> <result>/WEB-INF/{1}/{2}.jsp</result> <!-- /WEB-INF/User对应{1}/addInput.jsp对应{2}--> <result type="redirect" name="r_list">/{1}_list.action</result> <!-- 客户端的跳转 跳转到 好比说User.Action 就是User_list.action--> <!-- 打开User_add.action跳转到User_list.action--> </action> public class UserAction { public String addInput() { System.out.println("add input"); return "success"; } public String add() { System.out.println("add"); //添加完调到r_list 调用User_add以后会自动跳到User_list return "r_list"; } public String list() { System.out.println("list"); return "success"; } }
==============================================================================
4.指定多个配置文件
<include file="login.xml"></include>
<include file="system.xml"></include>
5.默认action
不会出现404错误 会有友好的页面
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/error.jsp</result>
</action>
6.structs2后缀
.action改了
伪造改为html等等 还能够去掉!!!value=""
<constant name="struts.action.extension" value="html"></constant>
struts2包中 default.proerties 里面有struts.action.extension=action,, 因此能够是.action或者为空
7.接收参数
1.使用action的属性接收
有一点点麻烦 要写好多action
---LoginAction.java
public class LoginAction extends ActionSupport
{
private String username;
private String password;
public String login()
{
System.out.println(username);//这个只是个测试 成功的话 后台console会输出用户名
//...逻辑处理
return SUCCESS;
}
getandset方法必定要写
}
配置
<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
</action>
还有一个login.jsp和success.jsp 就不写了 很简单的
jsp中还能够这样写 ${username}---${password}
!!!!!!!!!!!!!!!!!!!!!!!!!!!用struts2的标签来写
<s:property value="username"/>---<s:property value="password"/>
第二种方式的传值
public String list() { //传值的第一种方式 直接经过在action中设置相应的方法 this.setUsername("taojiatao"); this.setPassword("123"); //第二种方式 经过ActionContext完成值的传递 ActionContext.getContext().put("aaa", 12345); ActionContext.getContext().put("bbb", 56789); System.out.println("list"); return "success"; } ${aaa}---${bbb} //<%--<s:property value="aaa"/>---<s:property value="bbb"/> 这个取出来全是String的 //因此取一些不是String的东西会报错 能够所有加# value="#aaa" 只要是ActionContext中的 //数据必定加个# //--%>
2.使用Domain Model接收参数
把username和password封装到User类中
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ---LoginAction.java public class LoginAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login() { System.out.println(user.getUsername()); //...逻辑处理 return SUCCESS; } }
login.jsp
<form action="LoginAction.action" method="post">
UserName:<input type="text" name="user.username">//注意看这里
PassWord:<input type="password" name="user.password">
<input type="submit" value="submit">
</form>
3.model driven
User.java不变
---LoginAciton.java package com.imooc.action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class LoginAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); public String login() { System.out.println(user.getUsername()); //...逻辑处理 return SUCCESS; } //get set方法必须去掉 @Override public User getModel() { return user; } } <form action="LoginAction.action" method="post"> UserName:<input type="text" name="username"> PassWord:<input type="password" name="password"> <input type="submit" value="submit"> </form>