MVC设计模式

MVC(Model-View-Controller 模型-视图-控制器)是一个存在于服务器表达层的模型。在MVC经典架构中,强制性地把应用程序的输入、处理和输出分开,将程序分成3个核心模块——模型、视图、控制器。

struts2体系架构图 struts2框架_struts

在Web应用的MVC模式中存在如下划分:
Model部分:由JavaBean充当。
View部分:由JSP页面充当。
Controller部分:由Servlet充当。


Struts2 结构体系

Struts是Apache软件基金下的Jakarta项目的一部分,它目前有两个版本(Struts 1.x和Struts 2.x)都是基于MVC经典设计模式的
框架。
针对Struts 1框架中存在的缺陷与不足,诞生了全新的Struts 2框架。它修改了Struts 1框架中的缺陷,而且还提供了更加灵活与强大的功能。
Struts 2是基于WebWork技术开发的全新Web框架,其结构体系如图

struts2体系架构图 struts2框架_MVC_02


Action对象

Action对象是Struts 2框架中的重要对象,主要用于处理HTTP请求。
在Struts2框架之中,表单提交的数据会自动注入到与Action对象中相对应的属性,通过Action对象为属性提供setter方法进行注入。

public class UserAction extends ActionSupport {
    // 用户名属性
    private String username; 
    // 为username提供setter方法
    public void setUsername(String username) {
        this.username = username;
    }
    // 为username提供getter方法
    public String getUsername() {
        return username;
    }
    public String execute() {
        return SUCCESS;
    }
}

struts2体系架构图 struts2框架_MVC_03

配置struts.xml#

Struts 2框架中的Action对象是一个控制器的角色,Struts2框架通过它处理Http请求。其请求地址的映射需要在struts.xml文件中使用元素配置

<action name="userAction" class="com.wgh.action.UserAction" method="save">
     <result>success.jsp</result>
</action>

属性

说明

name

用于配置Action对象被请求的URL映射(理解为Action方法的返回值对应的)

class

指定Action对象的类名

method

设置请求Action对象时调用该对象的哪一个方法

converter

指定Action对象类型转换器的类

使用通配符简化配置

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="*Action" class="com.wgh.action.{1}Action">
            <result name="success">result.jsp </result>
            <result name="update">update.jsp</result>
            <result name="del">result.jsp</result>
        </action>
    </package>
</struts>

参考代码

public class FundAction extends ActionSupport {

    private int id;
    private Fund fund;
    private FundDao fundDao = new FundDaoHibernateImpl();
    private List<Fund> funds;

    /**
     * 新增数据
     *
     * @return
     */
    public String add() {
        fundDao.insert(fund);
        return "success";
    }

    /**
     * 根据id删除数据
     *
     * @return
     */
    public String delete() {
        fundDao.delete(id);
        return "success";
    }

    /**
     * 更新数据由fund
     *
     * @return
     */
    public String update() {
        fundDao.update(fund);
        return "success";
    }

    /**
     * 传入id转至update
     *
     * @return
     */
    public String startUpdate() {
        fund = fundDao.findById(id);
        return "startUpdate";
    }

    /**
     * 获取fund表所有数据
     *
     * @return
     */
    public String show() {
        funds = fundDao.findAll();
        ((Map) ActionContext.getContext().get("request")).put("fundList", funds);
        return "showFunds";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Fund getFund() {
        return fund;
    }

    public void setFund(Fund fund) {
        this.fund = fund;
    }

    public FundDao getFundDao() {
        return fundDao;
    }

    public void setFundDao(FundDao fundDao) {
        this.fundDao = fundDao;
    }

    public List<Fund> getFunds() {
        return funds;
    }

    public void setFunds(List<Fund> funds) {
        this.funds = funds;
    }

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <!-- 配置文件修改了,不需要重启服务器-->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- jsp中不使用struts的样式 -->
    <constant name="struts.ui.theme" value="simple" />
    <!-- Action所在的包的后缀 -->
    <constant name="struts.convention.package.locators" value="action,actions,controller,struts,struts2"/>

    <package name="fund" namespace="/fund" extends="struts-default">
        <!-- 动态方法调用测试 -->
        <action name="fundAction" class="com.mybank.fundtrans.controller.FundAction">
            <result name="login">/login.jsp</result>
            <result name="index" type="redirect">/index.jsp</result>
        </action>
        <!-- 使用通配符简化配置 -->
        <action name="*Fund" class="com.mybank.fundtrans.controller.FundAction"
                method="{1}">
            <result name="startUpdate">/fund/fund_update.jsp</result>
            <result name="showFunds">/fund/fund_list.jsp</result>
            <result name="success" type="chain">showFund</result>
        </action>
        <!-- 用于链接请求 -->

        <action name="*">
            <result name="success">/fund/{1}.jsp</result>
        </action>
    </package>

    <!-- Add packages here -->

</struts>