SpringMVC - MVC思想及SpringMVC简述

一、MVC思想

1、什么是MVC

MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离。把众多的业务逻辑聚集到一个部件里面,当然这种比较官方的解释是不能让我们足够清晰的理解什么是MVC的。用通俗的话来讲,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程模式。

注意!MVC不是设计模式!

MVC框架模式是一种复合模式,MVC的三个核心部件分别是

Model(模型):所有的用户数据、状态以及程序逻辑,独立于视图和控制器。
View(视图):呈现模型,类似于Web程序中的界面,视图会从模型中拿到需要展现的状态以及数据,对于相同的数据可以有多种不同的显示形式(视图)。
Controller(控制器):负责获取用户的输入信息,进行解析并反馈给模型,通常情况下一个视图具有一个控制器。

2、为什么要使用MVC

程序通过将M(Model)和V(View)的代码分离,实现了前后端代码的分离,会带来几个好处

① 可以使同一个程序使用不同的表现形式,如果控制器反馈给模型的数据发生了变化,那么模型将及时通知有关的视图,视图会对应的刷新自己所展现的内容
② 因为模型是独立于视图的,所以模型可复用,模型可以独立的移植到别的地方继续使用
③ 前后端的代码分离,使项目开发的分工更加明确,程序的测试更加简便,提高开发效率

其实控制器的功能类似于一个中转站,会决定调用那个模型去处理用户请求以及调用哪个视图去呈现给用户

3、JavaWeb中MVC模式的应用

在JavaWeb程序中,MVC框架模式是经常用到的,举一个Web程序的结构可以更好的理解MVC的理念


M - Model 模型:进行所有数据的处理工作,模型返回的数据是中立的,和数据格式无关,一个模型可以为多个视图来提供数据,所以模型的代码重复性比较低
V - View 视图:Web程序中指用户可以看到的并可以与之进行数据交互的界面,比如一个Html网页界面,或者某些客户端的界面,在前面讲过,MVC可以为程序处理很多不同的视图,用户在视图中进行输出数据以及一系列操作,注意:视图中不会发生数据的处理操作。
C - Controller 控制器:负责接受用户的输入,并且调用模型和视图去完成用户的需求,控制器不会输出也不会做出任何处理,只会接受请求并调用模型构件去处理用户的请求,然后在确定用哪个视图去显示返回的数据

4、Web程序中MVC模式的优点

耦合性低:视图(页面)和业务层(数据处理)分离,一个应用的业务流程或者业务规则的改变只需要改动MVC中的模型即可,不会影响到控制器与视图
● 部署快,成本低:MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上
● 可维护性高:分离视图层和业务逻辑层也使得WEB应用更易于维护和修改

5、Web程序中MVC模式的缺点

调试困难:因为模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试
● 不适合小型,中等规模的应用程序:在一个中小型的应用程序中,强制性的使用MVC进行开发,往往会花费大量时间,并且不能体现MVC的优势,同时会使开发变得繁琐
● 增加系统结构和实现的复杂性:对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
● 视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问:视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能

SpringMVC和Struts2的区别:

① springmvc的入口是一个servlet即前端控制器(DispatchServlet);
  struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter);
② springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例);
  struts2是基于类开发,传递参数是通过类的属性,只能设计为多例;
③ springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl;
  Struts采用值栈存储请求和响应的数据,通过OGNL存取数据;

在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合层来整合,它和Struts2一样都属于表现层的框架。

 二、Spring MVC框架

Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核心是两个核心:

● 处理器映射:选择使用哪个控制器来处理请求
● 视图解析器:选择结果应该如何渲染

1、SpringMVC处理流程

① Http请求:客户端请求提交到DispatcherServlet。 
② 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。 
③ 调用处理器:DispatcherServlet将请求提交到Controller。 
④-⑤ 调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。 
⑥-⑦ 处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 
⑧ Http响应:视图负责将结果显示到客户端。

2、SpringMVC核心类与接口

DispatcherServlet:前端控制器

Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。 

HandlerMapping:处理器映射 :能够完成客户请求到Controller映射,将请求映射到Handler上并返回处理器执行链

- 通过HandlerMapping(处理器映射),可以将Web 请求映射到正确的Handler(处理器)也就是Controller上;
- DispactherServlet(前端控制器) 将请求交给HandlerMapping,让他检查请求并找到一个合适的HandlerExecutionChain(处理器执行链),这个HandlerExecutionChain 包含一个能处理该请求的Handler;

Controller

需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。 
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。 
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

HandlerAdapter:处理器适配器 :执行具体的逻辑业务

- 负责执行DispactherServlet中HandlerExecutionChain的Handler;
- 从Handler中获取ModelAndView(模型与视图)对象,返回给DispactherServlet;

ViewResolver:视图解析器 :解析视图

- 通过视图名称解析视图;
- 返回视图对象;

④ HandlerExceptionResolver:处理器异常解析,将异常映射到统一错误页面,常见的404页面,不让用户看到具体的错误,友好提示;

⑤ LocaleResolver:本地化解析,解析客户端信息进行本地化;

⑥ ThemeResolver:主题解析,实现多风格,类似皮肤效果;

⑦ RequestToViewNameTranslator:请求到视图名转换器,当view为空时,从request中获取viewName;

⑧ FlashMapManager:FlashMap管理器,通常应用在重定向场景;

3、DispatcherServlet

是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项: 

① 截获符合特定格式的URL请求。 
② 初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
③ 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。  

三、SpringMVC配置

让我们来写一下我们的第一个 Spring MVC 程序

● 项目整体结构以及导入的jar: 

1、web.xml配置 - DispatcherServlet

DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 读取指定Spring配置文件,不配置默认为(/WEB-INF/<servlet-name>-servlet.xml) -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 拦截规则: -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

Servlet拦截匹配规则可以自已定义,拦截哪种URL合适? 

当映射为@RequestMapping("/item/allList.do")时,为例:

① *.htm *.do *.action - 例如:/item/allList.do

以扩展名方式进行拦截,不会导致静态文件(jpg,js,css)被拦截。这是最传统的方式,最简单也最实用;

② / - 例如:/item/1

可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。
弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦一些。后面有解决办法还算简单。

/* - 全都拦截 包括 jsp 以及所有静态资源 - 不推荐使用

这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。

2、SpringMVC配置文件 - 主要是开启注解功能、配置试图解析器

mvc配置文件 - applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!-- 开启注解扫描 - 扫描Controller下的组件 -->
    <context:component-scan base-package="com.sikiedu"></context:component-scan>

    <!-- 视图解析器 配置viewName前缀与后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:

@Controller - 声明Action组件

@Service - 声明Service组件    @Service("myMovieLister") 

@Repository - 声明Dao组件

@Component - 泛指组件, 当不好归类时. 

@RequestMapping("/menu") - 请求映射

@Resource - 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 

@Autowired - 用于注入,(srping提供的) 默认按类型装配 

@Transactional( rollbackFor={Exception.class}) - 事务管理

@ResponseBody

@Scope("prototype") - 设定bean的作用域
context:component-scan

3、配置文件完成了,下面开始写代码

① JSP界面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>游戏管理后台</title>
<meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- bootstrap framework -->
<link href="${pageContext.request.contextPath }/css/bootstrap.min.css" rel="stylesheet" media="screen">
<!-- main stylesheet -->
<link href="${pageContext.request.contextPath }/css/main.min.css" rel="stylesheet" media="screen" id="mainCss">
<!-- elegant icons -->
<link href="${pageContext.request.contextPath }/css/style.css" rel="stylesheet" media="screen">
<!-- datepicker -->
<link href="${pageContext.request.contextPath }/css/datepicker3.css" rel="stylesheet" media="screen">
<!-- jBox -->
<link href="${pageContext.request.contextPath }/css/jbox.css" rel="stylesheet" media="screen">
<link href="${pageContext.request.contextPath }/css/noticeborder.css" rel="stylesheet" media="screen">

</head>
<body class="side_menu_active side_menu_expanded">
    <div id="page_wrapper">

        <!-- header -->
        <header id="main_header">
        <div class="container-fluid">
            <!--logo-->
            <div class="brand_section">
                <a href="#">
                    <img src="${pageContext.request.contextPath }/picture/logo01.png" alt="site_logo" width="108" height="40" style="margin-top: 5px">
                </a>
            </div>
            <div class="header_user_actions dropdown">
                <div data-toggle="dropdown" class="dropdown-toggle user_dropdown">
                    <div class="user_avatar">
                        <img src="${pageContext.request.contextPath }/picture/head01.png" width="38" height="38">
                    </div>
                    <span class="caret"></span>
                </div>
                <ul class="dropdown-menu dropdown-menu-right">
                    <li>
                        <a href="#">个人中心</a>
                    </li>
                    <li>
                        <a href="#">注销</a>
                    </li>
                </ul>
            </div>
        </div>
        </header>

        <!-- main content -->
        <div id="main_wrapper">
            <div class="container-fluid">
                <div class="row">
                    <div class="col-md-12">
                        <div class="row">
                            <div class="col-md-10">
                                <table class="table table-yuk2 toggle-arrow-tiny" id="footable_demo" data-filter="#textFilter" data-page-size="5">
                                    <thead>
                                        <tr>
                                            <!--描述:商品数据标签-->
                                            <th>ID</th>
                                            <th>游戏名称</th>
                                            <th>类型</th>
                                            <th>原价</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <c:forEach items="${itemList }" var="item">
                                            <tr>
                                                <td>${item.item_id }</td>
                                                <td>${item.item_name }</td>
                                                <td>${item.item_type }</td>
                                                <td>${item.item_price }</td>

                                                <td data-value="1">
                                                    <a herf="#" id="edit_btn" class="btn btn-xs btn-info" data-toggle="modal" data-target="#editLayer" onclick="editGoods('${item.item_id}')">修改</a>
                                                    <a herf="#" id="del_btn" class="btn btn-xs btn-danger" onclick="deleteGoods('${item.item_id}')">删除</a>
                                                </td>
                                            </tr>
                                        </c:forEach>
                                    </tbody>
                                    <tfoot class="hide-if-no-paging">
                                        <tr>
                                            <td colspan="5">
                                                <ul class="pagination pagination-sm"></ul>
                                            </td>
                                        </tr>
                                    </tfoot>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- edit layer -->
        <div class="modal fade" id="editLayer">
            <div class="modal-dialog modal-content">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">
                            <span aria-hidden="true">&times;</span>
                            <span class="sr-only">Close</span>
                        </button>
                        <h4 class="modal-title">修改游戏信息</h4>
                    </div>
                    <div class="modal-body">
                        <!--游戏修改详情弹出层表单-->
                        <form class="form-horizontal" id="edit_item_form">
                            <!-- 游戏id隐藏域 -->
                            <input type="hidden" id="edit_item_id" name="item_id" />
                            <!-- 游戏名称 -->
                            <div class="form-group">
                                <label for="edit_item_name" class="col-sm-2 control-label">游戏名称</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="edit_item_name" placeholder="游戏名称" name="item_name">
                                </div>
                            </div>
                            <!-- 游戏类型 -->
                            <div class="form-group">
                                <label for="edit_item_price" class="col-sm-2 control-label">类型</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="edit_item_price" placeholder="类型" name="item_price">
                                </div>
                            </div>
                            <!-- 游戏原价 -->
                            <div class="form-group">
                                <label for="edit_item_price" class="col-sm-2 control-label">原价</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="edit_item_price" placeholder="原价" name="item_price">
                                </div>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
                        <button type="button" class="btn btn-primary btn-sm" onclick="updateItem()">确认修改</button>
                    </div>
                </div>
            </div>
        </div>

        <!-- add layer -->
        <div class="modal fade" id="addLayer">
            <div class="modal-dialog modal-content">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">
                            <span aria-hidden="true">&times;</span>
                            <span class="sr-only">Close</span>
                        </button>
                        <h4 class="modal-title">新增游戏</h4>
                    </div>
                    <div class="modal-body">
                        <!--添加游戏弹出层表单-->
                        <form class="form-horizontal" id="add_item_form">
                            <!-- 游戏id隐藏域 -->
                            <input type="hidden" id="add_item_id" name="item_id" />
                            <!-- 游戏名称 -->
                            <div class="form-group">
                                <label for="add_item_name" class="col-sm-2 control-label">游戏名称</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="add_item_name" placeholder="游戏名称" name="item_name">
                                </div>
                            </div>
                            <!-- 游戏类型 -->
                            <div class="form-group">
                                <label for="add_item_price" class="col-sm-2 control-label">类型</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="add_item_price" placeholder="类型" name="item_price">
                                </div>
                            </div>
                            <!-- 游戏原价 -->
                            <div class="form-group">
                                <label for="add_item_price" class="col-sm-2 control-label">原价</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="add_item_price" placeholder="原价" name="item_price">
                                </div>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
                        <button type="button" class="btn btn-primary btn-sm" onclick="addItem()">确认修改</button>
                    </div>
                </div>
            </div>
        </div>

        <!-- main menu -->
        <nav id="main_menu">
        <div class="menu_wrapper">
            <ul>
                <li class="first_level">
                    <a href="javascript:void(0)">
                        <span class="icon_document_alt first_level_icon"></span>
                        <span class="menu-title">游戏管理</span>
                    </a>
                    <ul>
                        <li class="submenu-title">游戏管理</li>
                        <!-- <li><a href="#" data-toggle="modal" data-target="#addLayer">商品添加</a></li> -->
                        <li>
                            <a href="${pageContext.request.contextPath }/item/myitemlist.do">游戏列表</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <div class="menu_toggle">
            <span class="icon_menu_toggle">
                <i class="arrow_carrot-2left toggle_left"></i>
                <i class="arrow_carrot-2right toggle_right" style="display: none"></i>
            </span>
        </div>
        </nav>
    </div>

    <!-- jQuery -->
    <script src="${pageContext.request.contextPath }/js/jquery.min.js"></script>
    <!-- jQuery Cookie -->
    <script src="${pageContext.request.contextPath }/js/jquerycookie.min.js"></script>
    <!-- Bootstrap Framework -->
    <script src="${pageContext.request.contextPath }/js/bootstrap.min.js"></script>
    <!-- retina images -->
    <script src="${pageContext.request.contextPath }/js/retina.min.js"></script>
    <!-- switchery -->
    <script src="${pageContext.request.contextPath }/js/switchery.min.js"></script>
    <!-- typeahead -->
    <script src="${pageContext.request.contextPath }/js/typeahead.bundle.min.js"></script>
    <!-- fastclick -->
    <script src="${pageContext.request.contextPath }/js/fastclick.min.js"></script>
    <!-- match height -->
    <script src="${pageContext.request.contextPath }/js/jquery.matchheight-min.js"></script>
    <!-- scrollbar -->
    <script src="${pageContext.request.contextPath }/js/jquery.mcustomscrollbar.concat.min.js"></script>
    <!-- moment.js (date library) -->
    <script src="${pageContext.request.contextPath }/js/moment-with-langs.min.js"></script>
    <!-- Yukon Admin functions -->
    <script src="${pageContext.request.contextPath }/js/yukon_all.min.js"></script>
    <!-- page specific plugins -->
    <!-- footable -->
    <script src="${pageContext.request.contextPath }/js/footable.min.js"></script>
    <script src="${pageContext.request.contextPath }/js/footable.paginate.min.js"></script>
    <script src="${pageContext.request.contextPath }/js/footable.filter.min.js"></script>
    <!-- datepicker -->
    <script src="${pageContext.request.contextPath }/js/bootstrap-datepicker.js"></script>
    <!-- jBox -->
    <script src="${pageContext.request.contextPath }/js/jbox.min.js"></script>

    <script type="text/javascript">
        $(function() {
            //footable
            yukon_footable.goodslist();
            //datepicker
            yukon_datepicker.p_forms_extended();
        })

        //修改弹框回显
        function toEdit(id) {
            $.ajax({
                type : "post",
                url : "${pageContext.request.contextPath }/item/toEdit",
                data : {
                    "id" : id
                },
                success : function(data) {
                    $("#edit_item_name").val(data.item_name);
                    $("#edit_item_type").val(data.item_type);
                    $("#edit_item_price").val(data.item_price);
                },
                dataType : "json"
            });
        }
        //确认修改
        function updateItem() {
            $.post("${pageContext.request.contextPath }/item/update.do", $(
                    "#edit_item_form").serialize(), function(data) {
                alert("游戏信息更新成功!");
                window.location.reload();
            });
        }

        //确认删除
        function deleteItem(id) {
            if (confirm('确实要删除该游戏吗?')) {
                $.post("${pageContext.request.contextPath }/item/delete.do", {
                    "id" : id
                }, function(data) {
                    window.location.reload();
                });
            }
        }

        //添加游戏
        function addItem() {
            $.post("${pageContext.request.contextPath }/item/save.do", $(
                    "#add_item_form").serialize(), function(data) {
                alert("游戏添加成功!");
                window.location.reload();
            });
        }
    </script>
</body>
</html>
item_list.jsp

② 数据模型

package com.sikiedu.bean;

/**
 *     游戏信息
 * @author 青鸟
 */
public class ItemInfo {

    // id
    private String item_id;
    // name
    private String item_name;
    // type
    private String item_type;
    // price
    private String item_price;

    public ItemInfo(String item_id, String item_name, String item_type, String item_price) {
        super();
        this.item_id = item_id;
        this.item_name = item_name;
        this.item_type = item_type;
        this.item_price = item_price;
    }

    public String getItem_id() {
        return item_id;
    }

    public void setItem_id(String item_id) {
        this.item_id = item_id;
    }

    public String getItem_name() {
        return item_name;
    }

    public void setItem_name(String item_name) {
        this.item_name = item_name;
    }

    public String getItem_type() {
        return item_type;
    }

    public void setItem_type(String item_type) {
        this.item_type = item_type;
    }

    public String getItem_price() {
        return item_price;
    }

    public void setItem_price(String item_price) {
        this.item_price = item_price;
    }

    @Override
    public String toString() {
        return "ItemInfo [item_id=" + item_id + ", item_name=" + item_name + ", item_type=" + item_type
                + ", item_price=" + item_price + "]";
    }

}
ItemInfo.java

③ 编写Controller - @RequestMapping、ModelAndView

package com.sikiedu.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sikiedu.bean.ItemInfo;

// 声明Action组件 - 控制器
@Controller()
// 请求映射 - 分级路径
@RequestMapping(value = "/item/")
public class itemController {

    // 请求映射 - 可以通过list.do、mylist.do、haha.do访问该处理器,限定GET、POST方式访问
@RequestMapping(value = { "list.do", "mylist.do", "haha.do" }, method = { RequestMethod.GET, RequestMethod.POST }) public ModelAndView list() { ModelAndView mav = new ModelAndView(); // 传递数据 ItemInfo info1 = new ItemInfo("1", "王者荣耀", "MOBA", "0"); ItemInfo info2 = new ItemInfo("2", "守望先锋", "射击", "198"); ItemInfo info3 = new ItemInfo("3", "吃鸡", "射击", "98"); ItemInfo info4 = new ItemInfo("4", "魔兽世界", "MMORPG", "0"); ItemInfo info5 = new ItemInfo("5", "部落冲突COC", "策略", "0"); List<ItemInfo> itemList = new ArrayList<ItemInfo>(); itemList.add(info1); itemList.add(info2); itemList.add(info3); itemList.add(info4); itemList.add(info5); // 将游戏列表返回给前台 mav.addObject("itemList", itemList); mav.setViewName("item_list"); return mav; }
   // 通过唯一路径list1.do访问,限定POST方式访问 @RequestMapping(value
= { "list1.do" }, method = { RequestMethod.POST }) public ModelAndView list1() { ModelAndView mav = new ModelAndView(); // 传递数据 ItemInfo info1 = new ItemInfo("1", "王者荣耀", "MOBA", "0"); ItemInfo info2 = new ItemInfo("2", "守望先锋", "射击", "198"); ItemInfo info3 = new ItemInfo("3", "吃鸡", "射击", "98"); ItemInfo info4 = new ItemInfo("4", "魔兽世界", "MMORPG", "0"); ItemInfo info5 = new ItemInfo("5", "部落冲突COC", "策略", "0"); List<ItemInfo> itemList = new ArrayList<ItemInfo>(); itemList.add(info1); itemList.add(info3); itemList.add(info5); itemList.add(info2); itemList.add(info4); // 将游戏列表返回给前台 mav.addObject("itemList", itemList); mav.setViewName("item_list"); return mav; } // 原生Servlet - 获取参数、请求转发、重定向 @RequestMapping() public void voidTest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取参数 req.getParameter(""); // 转发 req.getRequestDispatcher("").forward(req, resp); // 重定向 resp.sendRedirect(req.getContextPath() + "/xx.jap"); } // String - 转发 @RequestMapping(value = "forwardString.do") public String forwardString() { return "forward:list.do"; } // String - 重定向 @RequestMapping(value = "redirectString.do") public String redirectString() { return "redirect:mylist.do"; } }

运行结果

4、SpringMVC - Controller简要说明

● RequestMapping注解使用:

多请求;可以使用多个路径访问到该方法
  - @RequestMapping(value = {"list.do","allList.do","itemList.do"}) ② 限定请求方法;限定为GET和POST等
  - @RequestMapping(value = "list.do", method = RequestMethod.POST) ③ 窄化(简化)请求路径;以便于分级
  - 类使用:@RequestMapping(value = "/item/"),方法使用:@RequestMapping(value = "list.do")
  - 访问路径为/item/list.do

● Controller方法返回值:

ModelAndView:返回模型和视图
② void:使用原生request,response
③ String:
  - 返回视图名 viewName;比较推荐使用
  - 转发 forword:xxx;
  - 重定向 redirect:xxx;
④ 自定义类型 – 需要@ResponseBody注解

 

posted @ 2020-01-03 00:36  ohmok  阅读(397)  评论(0)    收藏  举报