java struts2_Java - 框架之 Struts2

一. Package 标签

1. 标签属性:

name        : 包的名称,只有在一个项目中不重名即可。

extends       : 继承哪个包,默认为 struts-default。

namespace  : 名称空间,与 标签中的 name 属性决定访问路径

- 名称空间写法:

- 带名称的: namespace="/a"

- 不带名称: namespace="/"

- 默认空间:    namespace=""

二. action 相关配置

1. action 标签配置 Action 类

2. action 标签的属性

- name         : 与 namespace 共同决定访问路径。

- class        : Action类的全路径。

- method    : 执行Action中的哪个方法的方法名,默认 execute。

- converter : 用户设置类型转换器。

三. 分模块开发配置

include : 用于导入其它的 struts.xml 文件

四. Action 三种编写方式:

1. Action 类是一个POJO的类 (简单的类-没有继承,接口...)

public classActionDemo1{publicString execute(){

System.out.println("Action1");return null;

}

}

2. 实现一个Action接口

public class ActionDemo2 implementsAction{

@Overridepublic String execute() throwsException {

System.out.println("Action2");return null;

}

}

3. Action类 继承 ActionSupport 类 (常用) ******

public class ActionDemo3 extendsActionSupport{

@Overridepublic String execute() throwsException {

System.out.println("Action3");returnNone;

}

}

五. Action的三种访问方式

1. method 的配置 :

请求路径:

跳转

接收配置路径(struts.xml):

类中:

public class UserAction extendsActionSupport{publicString find(){returnNone;

}

...

}

2. 通配符(常用) ******

请求路径:

跳转

public class ProductAction extendsActionSupport{publicString find(){returnNone;

}

...

}

3. 动态方法访问

# 开启动态方法访问

类中:

public class CustomerAction extendsActionSupport{publicString find(){returnNone;

}

...

}

注意: Servlet 是单例的,Action 是多例的 (不会出现线程安全问题)

六. 访问Servlet API 的三种方式 :

1. 完全解耦和的方式

注意:这种方式只能获取代表 request, session, application 的数据的 Map 集合, 不能操作这些对象本身的方法

# 编写 jsp

姓名:密码:

# 编写Action

public class RequestDemo1 extendsActionSupport{

@Overridepublic String execute() throwsException{//1. 接收参数

ActionContext context =ActionContext.getContext();

Map map =context.getParamters();for(String key : map.KeySet()){

String[] values=(String[]) map.get(key);

}//2. 向域对象保存数据

context.put("k1","v1"); //相当于 request.setAttribute();

context.getSession().put("k2","v2"); //相当于 session.setAttribute();

context.getApplication().put("k3","v3"); //相当于 application.setAttribute();

returnSUCCESS;

}

}

2. 原生的方式访问

注意:可以操作域对象的数据,同时也可以获取对象的方法

# 编写 Action

public class RequestDemo1 extendsActionSupport{

@Overridepublic String execute() throwsException{//1. 接收参数

ActionContext context =ServletActionContext.getRequest();

Map map =context.getParamterMap();for(String key : map.KeySet()){

String[] values=map.get(key);

}//2. 向域对象保存数据//向 request 中保存数据

request.setAttribute("k1","v1");//向 session 中保存数据

request.getSession().setAttribute("k2","v2");//向 application 中保存数据

ServletActionContext.getServletContext().setAttribute("k3","v3");returnSUCCESS;

}

}

3. 接口注入方式

public class RequestDemo3 extends ActionSupport implementsServletRequestAware, ServletContextAware{privateHttpServletRequest request;privateServletContext context;

@Overridepublic String execute() throwsException{//1. 接受参数

Map

Map map =context.getParamterMap();for(String key : map.KeySet()){

String[] values=map.get(key);

}//2. 向域对象保存数据//向 request 中保存数据

request.setAttribute("k1","v1");//向 session 中保存数据

request.getSession().setAttribute("k2","v2");//向 application 中保存数据

context.setAttribute("k3","v3");return super.execute();

}

@Overridepublic voidsetServletRequest(HttpServletRequest request){this.request =request;

}

@Overridepublic voidsetServletContext(ServletContext context){this.context =context;

}

}

七. 页面显示配置

1. 全局/局部 结果页面

- 全局指的是包中一次配置,在这个包中所有 action 返回了这个值,就可以跳转这个页面

/demo1/demo1.jsp

// 局部/demo1/demo1.jsp

// 全局

2. result 标签的配置

- result 标签用于配置页面的跳转,在 result 标签上有两个属性:

name : 逻辑视图的名称,默认值 success。

type : 页面跳转的类型。

- dispatcher : 默认类型,请求转发 (Action 转发 JSP)

- redirect   : 重定向。 (Action 重定向 JSP)

- chain      : 转发。 (Action 转发 Action)

- redirectAction : 重定向。 (Action 重定向 Action)

- stream      : Struts2 中提供文件下载的功能。

八. Struts2 的数据封装

1. 属性驱动:提供属性的 set 方法

# 编写 Action

public class UserAction1 extendsActionSupport {privateString name;privateString pwd;//属性的 set 方法:

public void setName(String name){ this.name=name; }public void setPwd(String pwd){ this.pwd=pwd; }

@OverridepublicString execute() thows Exception {//接收数据

System.out.println(name);

System.out.println(pwd);//封装数据

User user = newUser();

user.setName(user);

user.setPwd(pwd);returnNONE;

}

}

2. 属性驱动:页面中提供表达式

# 页面

// Action 对象的属性名(user.跟set方法名一直)

# 编写 Action

public class UserAction1 extendsActionSupport {//提供一个 User 对象

privateUser user;//提供 user 的 get和set 方法: get必给

publicUser getUser(){returnuser;

}public voidsetUser(User user){this.user =user;

}

@Overridepublic String execute() throwsExecption {

System.out.println(user);returnNONE;

}

}

3. 模型驱动 (常用)

# 编写 Action

//手动提供实例对象

private User user = newUser();

@OverridepublicUser getModel() {returnuser;

}

@Overridepublic String execute() throwsException {

System.out.println(user);returnNONE;

}

九. Struts 的复杂类型数据封装

1. 封装数据到 List 集合中

# 编写 JSP

# 编写 Action

public class ProductAction1 extendsActionSupport{private Listproducts;//提供set 和 get 方法

public ListsetProducts(){this.products =products;

}public ListgetProducts(){returnproducts;

}

@Overridepublic String execute() throwsException{for(Product product : products) {

System.out.rpint(product);

}returnNONE;

}

}

2. 封装数据到 Map 集合中

# 编写 JSP

# 编写 Action

public class ProductAction1 extendsActionSupport{private Mapmap;//提供set 和 get 方法

public MapgetMap(){returnmap;

}public void setMapmap){this.map =map;

}

@Overridepublic String execute() throwsException{for(Product key : map.KeySet()) {

Product product=map.get(key);

System.out.rpint(key+ "" +product);

}returnNONE;

}

}

十. OGNL

0. 值栈(ValueStack)

类似于一个数据中转站( Struts2 框架中的数据都存储在了 ValueStack 中 )

- ValueStack 接口,实现类 OgnlValueStack 对象。

- ValueStack 贯穿整个 Action 的生命周期 (Action一旦创建,框架就会创建一个 ValueStack 对象)。

// 值栈内部结构

Root    : CompoundRoot, 就是一个 ArrayList;

Context : OgnlContext, 就是一个Map。

1. 调用对象的方法

2. 访问对象的静态方法

// 静态方法访问在 Struts2 中默认是关闭的// 开启静态方法访问权限

3. 操作值栈 - 存入数据

//方式一:使用 Action 本身在值栈中的特性

public class ValueStackDemo3 extendsActionSupport{privateUser user;//需要提供 get 方法

publicUser getUser(){returnuser;

}

@Overridepublic String execute() throwsException{//ValueStack 中存值

user = new User("a","2");returnSUCCESS;

}

}

//方式二:使用值栈中的方法实现

public class ValueStackDemo4 extendsActionSupport{

@Overridepublic String execute() throwsException{

ValueStack valueStack=ActionContext.getContext().getValueStack();//此时 User在栈顶的位置

User user = new User("b","3");

ValueStack.push(user);//创建一个Map集合,将Map加入栈中

ValueStack.set("name","zs");return super.execute();

}

}

3. 操作值栈 - 获取数据

public class ValueStackDemo5 extendsActionSupport{

@Overridepublic String execute() throwsException{//向值栈中保存一个对象

User user = new User("a","1");

ActionContext.getContext().getValueStack().push(user);//向值栈中保存一个集合

List list = new ArrayList();

list.add(new User("b","1"));

list.add(new User("c","1"));

list.add(new User("d","1"));

ActionContext.getContext().getValueStack().set("list", list);//向 context 中存入数据

ServletActionContext.getRequest().setAttribute("name","q1");

ServletActionContext.getRequest().getSession.setAttribute("name","q2");

ServletActionContext.getServletContext().setAttribute("name","q3");return super.execute();

}

}

# XML 文件

# 获取一个对象的数据

# 获取集合中的数据

# 获取context中的数据

// 接收参数: xxx?id=1

十一. OGNL 符号

0. 获取 context 的数据:

request.setAttribute("name","q1");

%>

1. 使用 # 构建map 集合

-

-

2. 使用 %

request.setAttribute("name","q1");

%>// 强制解析为 OGNL// 强制不解析 OGNL

3. 使用 $

// 属性文件

# 国际化

// XML文件filename=${ 文件名 }

十二. Struts2 拦截器

1. 编写拦截器

public class InterceptorDemo1 extendsAbstractInterceptor{

@Overridepublic String intercept(ActionInvocation invocation) throwsException{

System.out.prinln("拦截器");returninvocation.invoke();

}

}

2. 拦截器配置

方式一:

// 方式一: 定义拦截器配置// 定义拦截器

/demo1/demo1.jsp// 引入拦截器 (注意:一旦引入自定义拦截器,默认拦截器就不会执行了)// 引入默认拦截器// 自定义拦截器// 自定义拦截器

方式二:

// 方式二: 定义拦截器栈

// 定义拦截器栈

// 引入默认拦截器// 自定义拦截器// 自定义拦截器

/demo1/demo1.jsp// 引入拦截器栈

十三. 通用标签库

1. 导入

2. 判断标签

3">大于3

小于3

等于3

3. 循环标签

// 遍历 list

s

// 遍历 map

-- <:propertyvalue>

// 遍历 数字

十三. UI标签库

文档走起..

十四. Struts2 执行流程

请求-> 核心过滤器-> 创建 ActionProxy 方法, 在这个内部-> ActionInvocation.invoke() 在这个方法中递归执行一组拦截器

-> Action -> Result(最终返回一个字符) -> 拦截器之后的代码..

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值