Struts2 Learner02

 

interceptor是一个拦截器栈 看出来了吗

web目录下

---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.jar

---web/WEB-INF
---result.jsp

<%@ 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/
存在

第二步:action是否存在 如果不存在则去默认namespace的package里面寻找action
第三步:如果没有,则报错
不存在
第二步:检查上一级路径的package是否存在(直到默认namespace),重复第一步
第三步:如果没有 则报错

3.动态方法调用
为了解决一个Action对应多个请求的处理 以免Action太多
方法 1.指定method属性 2.感叹号方式 3.通配符方式
1.指定method属性
---HelloWordAction.java

public String add(){return SUCCESS;}
public String update(){return SUCCESS;}

 


---struts.xml

<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.感叹号方式 不是很建议使用

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>

 

转载于:https://www.cnblogs.com/taojiatao/p/4945330.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值