Java - 框架之 Struts2

一. Package 标签

1. 标签属性:
name        : 包的名称,只有在一个项目中不重名即可。
extends       : 继承哪个包,默认为 struts-default。
namespace  : 名称空间,与<action> 标签中的 name 属性决定访问路径
    - 名称空间写法:
        - 带名称的: namespace="/a"
        - 不带名称: namespace="/"
        - 默认空间:    namespace=""

二. action 相关配置
1. action 标签配置 Action 类
2. action 标签的属性
    - name         : 与 namespace 共同决定访问路径。
    - class        : Action类的全路径。
    - method    : 执行Action中的哪个方法的方法名,默认 execute。
    - converter : 用户设置类型转换器。

三. 分模块开发配置
include : 用于导入其它的 struts.xml 文件
<include file="xxx/struts.xml">

四. Action 三种编写方式:

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

public class ActionDemo1{
    public String execute(){
        System.out.println("Action1");
        return null;
    }
}

2. 实现一个Action接口

public class ActionDemo2 implements Action{

    @Override
    public String execute() throws Exception {
        System.out.println("Action2");
        return null;
    }
}

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

public class ActionDemo3 extends ActionSupport{

    @Override
    public String execute() throws Exception {
        System.out.println("Action3");
        return None;
    }
}

五. Action的三种访问方式

1. method 的配置 :

请求路径:

<a href="${ pageContext.request.contextPath }/userFind.action">跳转</a> 

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

<package name="demo3" extends="struts-default" namespace="/">
    <action name="userFind" class="com.xx.demo1.UserAction" method="find"></action>
    <action name="userUpdate" class="com.xx.demo1.UserAction" method="update"></action>
    <action name="userDelete" class="com.xx.demo1.UserAction" method="delete"></action>
    <action name="userSave" class="com.xx.demo1.UserAction" method="save"></action>
</package>

类中:

public class UserAction extends ActionSupport{
    public String find(){
        return None;
    }
    ...
}

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

请求路径:

<a href="${ pageContext.request.contextPath }/product_find.action">跳转</a> 
<action name="product_*" class="com.xxx.ProductAction" method="{1}"></action>
public class ProductAction extends ActionSupport{
    public String find(){
        return None;
    }
    ...
}

3. 动态方法访问

<a href="${ pageContext.request.contextPath }/customer!find"></a>

# 开启动态方法访问

<constant name="struts.endable.DynamicMethodInvocation" value="true" />
<action name="customer" class="com.xxx.CustomerAction"></action>

类中:

public class CustomerAction extends ActionSupport{
    public String find(){
        return None;
    }
    ...
}

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

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

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

# 编写 jsp

<form action="${ pageContext.request.contextPath }/requestDemo1.action"  method="post">
    姓名:<input type="text" name="name">
    密码:<input type="password" name="pwd">
    <input type="submit" value="go">
</form>

# 编写Action

public class RequestDemo1 extends ActionSupport{

    @Override
    public String execute() throws Exception{
        // 1. 接收参数
        ActionContext context = ActionContext.getContext();

        Map<String, Object> 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();

        return SUCCESS;

    }
}

2. 原生的方式访问

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

# 编写 Action

public class RequestDemo1 extends ActionSupport{

    @Override
    public String execute() throws Exception{
        // 1. 接收参数
        ActionContext context = ServletActionContext.getRequest();

        Map<String, String[]> 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");  

        return SUCCESS;

    }
}

3. 接口注入方式

public class RequestDemo3 extends ActionSupport implements ServletRequestAware, ServletContextAware{
    private HttpServletRequest request;
    private ServletContext context;

    @Override
    public String execute() throws Exception{
        // 1. 接受参数
        Map<String, String[] map = request.getParamterMap();
        Map<String, String[]> 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();

    }

    @Override
    public void setServletRequest(HttpServletRequest request){
        this.request = request;
    }

    @Override
    public void setServletContext(ServletContext context){
        this.context = context;
    }

}

七. 页面显示配置

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

<global-results>
    <result name="success">/demo1/demo1.jsp</result>
</global-results>

<action name="requestDemo1" class="com.xx">
    // 局部
    <result name="success">/demo1/demo1.jsp</result>
</action>

// 全局
<action name="requestDemo2" class="com.xx"></action>
<action name="requestDemo3" class="com.xx"></action>

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 extends ActionSupport {
    private String name;
    private String pwd;

    // 属性的 set 方法:
    public void setName(String name){ this.name=name; }
    public void setPwd(String pwd){ this.pwd=pwd; }

    @Override
    public String execute() thows Exception {
        // 接收数据
        System.out.println(name);
        System.out.println(pwd);

        // 封装数据
        User user = new User();
        user.setName(user);
        user.setPwd(pwd);

        return NONE;
    }

}

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

<form>
                    // Action 对象的属性名(user.跟set方法名一直)
    <input type="text" name="user.name">
</form>

# 编写 Action

public class UserAction1 extends ActionSupport {

    // 提供一个 User 对象
    private User user;
    // 提供 user 的 get和set 方法: get必给

    public User getUser(){
        return user;
    }

    public void setUser(User user){
        this.user = user;
    }

    @Override
    public String execute() throws Execption {
        System.out.println(user);
        return NONE;
    }

}

3. 模型驱动 (常用)

# 编写 Action

// 手动提供实例对象
private User user = new User();

@Override
public User getModel() {
    return user;
}

@Override
public String execute() throws Exception {
    System.out.println(user);
    return NONE;
}

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

1. 封装数据到 List 集合中

# 编写 JSP

<input type="text" name="products[0].name">
<input type="text" name="products[0].price">
<input type="text" name="products[1].name">
<input type="text" name="products[2].price">

# 编写 Action

public class ProductAction1 extends ActionSupport{
    private List<product> products;

    // 提供set 和 get 方法

    public List<Product> setProducts(){
        this.products = products;
    }

    public List<Product> getProducts(){
        return products;
    }

    @Override
    public String execute() throws Exception{
        for(Product product : products) {
            System.out.rpint(product);
        }
        return NONE;
    }
}

2. 封装数据到 Map 集合中

# 编写 JSP

<input type="text" name="map["a"].name">
<input type="text" name="map["a"].price">
<input type="text" name="map["b"].name">
<input type="text" name="map["b"].price">

# 编写 Action

public class ProductAction1 extends ActionSupport{
    private Map<String, Product> map;

    // 提供set 和 get 方法

    public Map<String, Product> getMap(){
        return map;
    }

    public void setMap<Map<String, Product> map){
        this.map = map;
    }

    @Override
    public String execute() throws Exception{
        for(Product key : map.KeySet()) {
            Product product = map.get(key);
            System.out.rpint(key+ "" +product);
        }
        return NONE;
    }
}

原文地址:https://www.cnblogs.com/chaoqi/p/10703852.html

时间: 2024-11-08 23:45:09

Java - 框架之 Struts2的相关文章

java框架篇---Struts2的处理流程

一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是清理当前线程的ActionContext.Dispatcher,FilterDispatcher主要是通过ActionMapper来决定需要调用那个Action,FilterDispatcher是控制器的核心,也是MVC中控制层的核心组建). 核心控制器组建FilterDispatcher根据Act

Java框架之Struts2(六)

一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. 它使用相同的表达式去存取对象的属性 Struts 2 默认的表达式语言是 OGNL,原因是它相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSp

java web 框架之struts2

简介:struts2是一个典型的mvc架构.利用它可是方便的实现某些功能. struts2 的工作流程图以及动态的action: 浏览器请求经过web容器,进入到struts2过滤器,然后搜索匹配,如果有与之对应的action对象,就会调用action对象的execut()方法,并根据处理的结果返回相应的值.通过创建多个action对象可以实现动态的action.也就是为了解决业务请求的多样性. 园长第一次接触框架,对于struts2框架的配置并不是很熟悉,对于初学者来说,很有必要讲讲strut

java 框架 面试 2

1.谈谈你对Struts的理解. 答: 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类.我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理. 一个扩展知识点:struts的配置文件可以有多个,可

Java框架服务

Java从诞生到现在,一路飙升,可以说红遍全球,红到发紫.随着Java的流行,促生了许多java框架:Spring.WebWork.Struts.HIbernate.JDiy.JFinal.Quartz.Welocity.IBATIS.Compiere ERP&CRM Spring Framework[Java开源J2EE框架] Spring是一个解决了许多在J2EE开发中常见的问题的强大框架.Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯.Spring

框架: Struts2 讲解 1

一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2.三大框架: Struts2,Hibernate,Spring 3.学好框架: 由于框架中细节很多,知识点比较零散,课后总结和做好笔记就变得尤为重要. 二.关于三层架构 Struts2 : MVC框架. Hibernate:持久层框架(DAO,与数据库打交道).   Spring :IoC(控制反转

ssh框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤

原创整理不易,转载请注明出处:ssh框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤 代码下载地址:http://www.zuidaima.com/share/1760074977233920.htm 最近闲来无事可做,于是开始学习struts2.Struts2和struts1.webwork2有什么区别我也不说了,网上有很多这方面的资料.以前在项目中从未使用过struts,一直使用spring+hibernate,现在既然学习了Struts,也不能

Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程

原创整理不易,转载请注明出处:Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程 代码下载地址:http://www.zuidaima.com/share/1778685765291008.htm 在<Struts2教程4:使用validate方法验证数据>中曾讲到使用validate方法来验证客户端提交的数据,但如果使用validate方法就会将验证代码和正常的逻辑代码混在一起,但这样做并不利于代码维护,而且也很难将过些代码用于其他程序的验证.在St

对java框架的几点认识

java框架实在是太多了,网上一抄一大段,根本就了解不到什么.我还是以我的经验来说一下j2ee的框架.1.首先力推struts2框架,这是最经典的框架(可以说没有“之一”).可以帮你快速搭建出一个MVC模型出来.(注:struts1已经很少用了,且问题也很多,强烈推荐使用struts2).2.Spring框架,这是排行第二的框架(我个人排得,非权威),这个框架出彩的地方就在于它的“依赖注入”和“控制反转”.简单的说,就是在程序运行的时候才将参数注入到容器里.3.持久层框架选Hibernate和I