java框架5-Spring MVC

Posted Lazy的笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java框架5-Spring MVC相关的知识,希望对你有一定的参考价值。

MVC设计模式
视图View-对应组件:JSP或者html文件
控制器(Controller)-对应组件:Servlet
模型(Model)-对应组件:JavaBean(dao/pojo/service)

dao:数据接口层
pojo:实体类
service:业务层
Servlet:处理用户请求业务层(负责流程控制)

JSP Model2
JSP:负责生产动态网页
Servlet:负责流程控制
JavaBean:负责业务逻辑处理
浏览器(请求)——Servlet(控制器)——javabean——数据库——javabean——JSP——浏览器

视图:
解释模型
接收数据更新请求
发送用户输入给控制器
允许控制器选择视图

控制器:
接收用户请求
调用模型响应用户请求
选择视图显示响应结果

模型:
封装应用程序状态
响应状态查询
处理业务流程
通知视图业务状态更新

MVC优点
多视图共享一个模型,大大提高代码的可重用性
MVC三个模块相互独立,松耦合架构
控制器提供了应用程序的灵活性和可配置性
有利于软件工程化管理
完美的系统架构=松耦合+高重用性+高扩展性

MVC缺点:
原理复杂
增加了系统结构和实现的复杂性
视图对模型数据低效率访问
(不适合小型或中型项目)

Spring MVC环境的搭建(用于web项目开发的架构)
结构最清晰的MVC Model2实现
Controller:代替了servlet
ModeAndView
Actor——Controller——model——Controller——view

SpringMVC框架搭建步骤
1、下载jar文件并导入工程
spring-web-3.2.13.RELEASE.jar
spring-webmvc-3.2.13.RELEASE.jar
2、配置文件
在web.xml中配置servlet
创建Spring MVC的配置
3、创建Controller处理请求控制器
BeanNameUrlHandlerMapping
4、创建View-Jsp
5、部署运行

web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
    
  <!-- 核心控制器配置DispatchServlet -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc-servlet.xml</param-value>
      </init-param>
      <!-- 启动容器时加载DispatcherServlet -->
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
 
</web-app>


springMVC配置文件
<?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:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
        <!-- 配置处理器映射,HandlerMapping -->
        <!-- 访问index.html路径,它是名义上的路径,其实是交到IndexController这个类中去处理,代替了原先servlet这个类要继承AbstractController类 -->
        <bean name="/index.html" class="cn.smbms.controller.IndexController"/>
        
        <!-- 配置视图解析器 /WEB-INF/jsp/index.jsp-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--/WEB-INF/jsp/访问的前缀  -->
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <!-- .jsp访问的后缀   ModelAndView("index");这个是index限定名,也是拼接成/WEB-INF/jsp/index.jsp完整访问路径-->
            <property name="suffix" value=".jsp"></property>
        </bean>
        
</beans>

package cn.smbms.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class IndexController extends AbstractController{
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        System.out.println("hello,spring mvc!");
        return new ModelAndView("index");
    }
}

若有多个请求时,需要配置多个映射关系,并建立多个Controller,这样很繁琐。
基于注解的处理器
<mvc:annotation-driven/>
DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
<context:component-scan />
@Controller
@RequestMapping

springmvc-servlet.xml
 <!-- 使用注解实现Controller -->
<mvc:annotation-driven />
<!-- 启动注解器 -->
 <context:component-scan base-package="cn.smbms.controller" />
@Controller
public class IndexController{
//index访问的url

@Controller
public class IndexController{
    //index访问的url
    @RequestMapping("/index")
    protected ModelAndView index(){
        System.out.println("注解实现SpringMvc");
        //"index"是逻辑视图返回值
        return new ModelAndView("index");
    }    
}


DispatcherServlet(前端控制器)
Spring MVC最核心的类
web.xml中配置
Handler(处理器):对应MVC中的C(Controller层)
类型:Object
作用:实际处理请求
标注了@RequestMapping的方法都可以看作是一个Handler
ModelAndView
逻辑视图名
模型对象

核心组件
HandlerMapping(处理映射)
BeanNameUrlHandlerMapping(默认)
将请求URL映射到同名的控制器Bean上
DefaultAnnotationHandlerMapping
将请求映射标注了@RequestMapping的方法都可以看作是一个Handler

HandlerAdapter(适配器)
AnnotationMethodHandlerAdapter
RequestMappingHandlerAdapter

ViewResolver(视图解析器)
InternalResourceViewResolver


SpringMVC框架特点
清晰地角色划分
灵活配置功能
提供了大量的控制器接口和实现
真正做到与View层的实现无关(JSP/Velocity/Xslt等)
国际化支持
面向接口编程
Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起

参数的传递与视图解析器
参数传递(View to Controller)
参数传递(Controller to View)
视图解析器(InternalResourceViewResolver)

@RequestMapping参数传递
标注在方法定义处
@RequestMapping("/welcome")
protected String welcome(@RequestParam String username){
    System.out.println("注解实现SpringMvc"+username);
    //"index"是逻辑视图名
    return "index";
}@RequestParam参数传递
访问url:http://localhost:8085/SMBMS-MVC/welcome?username=lazy

标注在类定义处
@Controller
@RequestMapping("/lazy")相当于一个根目录
public class IndexController{
    //index访问的url
    @RequestMapping("/index")
    protected ModelAndView index(){
        System.out.println("注解实现SpringMvc");
        //"index"是逻辑视图返回值
        return new ModelAndView("index");
    }
    
    //index访问的url会跳转到/WEB-INF/jsp/文件下的index.jsp页面上
    @RequestMapping("/welcome")
    protected String welcome(@RequestParam String username){
        System.out.println("注解实现SpringMvc"+username);
        //"index"是逻辑视图返回值
        return "index";
    }
}访问的url:http://localhost:8085/SMBMS-MVC/lazy/welcome?username=lazy

映射规则
通过请求URL进行映射
通过请求参数进行映射
若选择方法参数直接入参的话,方法入参必须与请求参数名保持一致
通过请求方法进行映射
GET
POST

@RequestParam
value
required 默认true,是否必须请求是否有参数
defaultValue
@RequestParam(value="username",required=false)

如何将模型数据传递给视图
ModelAndView
包含视图信息和模型数据信息
常用方法
添加模型数据
ModelAndView addObject(String attirbuteName,Object attributeValue);
ModelAndView addAllObjects(Map<String,?> modelMap);
设置视图
void setView(View view)
void setViewName(String viewName);
    @RequestMapping("/index1")
    protected ModelAndView index1(String username){
        ModelAndView mView = new ModelAndView();
        mView.addObject("username", username);
        mView.setViewName("index");
        //"index"是逻辑视图返回值
        return mView;
}
将数据传到index.jsp页面上
  <body>
    Hello Spring MVC. <br>
    <h1>username------------>${username}</h1>
  </body>
使用Model给视图传递数据,一般推荐使用model传递数据。
Model
数据结构:Map类型
常用方法:添加模型数据
Model.addAttribute(String attirbuteName,Object attributeValue)
处理方法的入参为Model类型,
@RequestMapping("/index2")
protected String index2(String username,Model model){
    model.addAttribute("username", username);
    //"index"是逻辑视图返回值
    return "index";
}
使用map给视图传递数据
@RequestMapping("/index3")
protected String index2(String username,Map<String,Object> model){
    model.put("username", username);
    //"index"是逻辑视图返回值
    return "index";
}

视图解析器-ViewResolver
将逻辑视图名与JSP等视图技术进行匹配
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--/WEB-INF/jsp/访问的前缀  -->
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <!-- .jsp访问的后缀   ModelAndView("index");这个是index限定名,也是拼接成/WEB-INF/jsp/index.jsp完整访问路径-->
            <property name="suffix" value=".jsp"></property>
        </bean>
/WEB-INF/jsp/index.jsp  其中index 是逻辑视图名

InternalResourceViewResolver主要用于JSP页面的视图

以上是关于java框架5-Spring MVC的主要内容,如果未能解决你的问题,请参考以下文章

Spring5框架 笔记总结

第一节———java复习计划

SSM 三大框架系列:Spring 5 + Spring MVC 5 + MyBatis 3.5 整合(附源码)

Spring框架学习总结(上)

SSM框架整合Spring,SpringMVC,Mybatis

SSM框架整合Spring,SpringMVC,Mybatis