springMVC入门

一、springmvc简介

 什么是springMVC?
   Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。 

   Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0      更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。

二、springmvc的优点

1、Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。

2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)

3、Spring3 MVC的灵活是你无法想像的,Spring框架的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制

三、springmvc的流程图

1、SpringMVC处理请求的流程
  首先用户发送请求-->DispatherServlet
  DispatcherServlet-->HandlerMapping
  DispatcherServlet-->HandlerAdapter
  HandlerAdapter-->处理器功能处理方法的调用
  ModelAndView的逻辑视图名-->ViewRecolver
  View-->渲染
  返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束

2、SpringMVC核心开发步骤
  DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
  HandlerMapping的配置,从而将请求映射到处理器
  HandlerAdapter的配置,从而支持多种类型的处理器
  处理器(页面控制器)的配置,从而刊行功能处理
  ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术

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

<!-- Spring MVC servlet -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <!--web.xml 3.0的新特性,是否支持异步-->
        <async-supported>true</async-supported>
    </servlet>


  请求到处理器映射(HandlerMapping):
   处理器适配器(HandlerAdapter)
  视图解析器(ViewResolver)
  处理器或页面控制器(Controller)
  验证器(Validator)
  命令对象(Command 请求参数绑定到的对象就叫命令对象)
  表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)

四、如何项目中添加springmvc框架

1、导入springmvc相关依赖(注意:用自定义标签库,需要三个jstl/standard/tomcat-jsp-api)

<!-- 缺少standard/tomcat-jsp-api这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
<!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.2.RELEASE</version>
      </dependency>

<dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
      <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
      </dependency>

 2、导入springmvc框架的配置文件(扫面controller、视图解析器)

springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
       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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!-- 通过context:component-scan元素扫描指定包下的控制器-->
    <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.zking.ssm02"/>

    <!--1) use-dafault-filters="false"的情况下,根据表达式包含(include-filter)或排除(exclude-filter)指定包-->
    <!--<context:component-scan base-package="com.zking.zf" use-default-filters="false">
        <context:include-filter type="regex" expression=".+\.controller\..*"/>-->
        <!--<context:exclude-filter type="regex" expression=".+\.controller2\..*"/>-->
    <!--</context:component-scan>-->

    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
	<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
    <!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--3) ViewResolver 视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--4) 单独处理图片、样式、js等资源 -->
    <!--<mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>

 3、配置web.xml配置中央控制器DispatcherServlet

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
  <display-name>Archetype Created Web Application</display-name>
    <!-- Spring和web项目集成start -->
    <!-- spring上下文配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- 读取Spring上下文的监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- Spring和web项目集成end -->

    <!-- 防止Spring内存溢出监听器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>

    <!-- 中文乱码处理 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--web.xml 3.0的新特性,是否支持异步-->
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Spring MVC servlet -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <!--web.xml 3.0的新特性,是否支持异步-->
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

五、springmvc入门的第一个小程序:HelloWorld

输入:localhost:8080/user/xxx/hello ,会打印出hello springmvc。

springmvc处理请求的流程:

浏览器通过地址截取到除了项目名后的映射路径,通过映射路径以及spring配置的一个类HandlerMapping处理器映射器,HandlerAdapter处理器适配器,找到后端具体处理逻辑代码的子控制器,处理完的业务逻辑返回的结果交给视图解析器渲染结果给客户端。

package com.zking.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author 疯子侠
 * @site www.donggua.com
 * @company donggua公司
 * @create 2018-12-21 16:57
 */
@Controller
@RequestMapping("/user")
public class HelloController {

    @RequestMapping("/xxx/hello")
    public String hello(){
        System.out.println("hello springmvc");
        return "xxx";
    }
}

六、常用注解

@pathvarivale restful风格
@Controller:用于标识处理器类   
@RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法

   常用参数:value、method
   可将@RequestMapping标签定义到类名处窄化路径  
  @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定    

   常用参数:value、required、defaultValue
注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的     
     

 

七 、页面跳转

以书本的增删查改为例

理解上面的hello springmvc例子 

1、查询、新增、删除、修改:

package com.aa.ssm02.controller;

import com.aa.ssm02.model.Book;
import com.aa.ssm02.service.BookService;
import com.aa.ssm02.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author 疯子侠
 * @site www.donggua.com
 * @company donggua公司
 * @create 2018-12-22 22:10
 */
@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;
    @RequestMapping("/list")
    public String list(HttpServletRequest request, Book book){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<Book> books = bookService.queryByNamePager(book, pageBean);
        request.setAttribute("pageBean",pageBean);
        request.setAttribute("bookList",books);
        return "bookList";
    }
    
    //传值bid,注解@PathVariable(value="bid")
    @RequestMapping("/delete/{bid}")
    public String delete(@PathVariable(value="bid") Integer bid){
        int i = bookService.deleteByPrimaryKey(bid);
        System.out.println(i);
        return "redirect:/book/list";
    }

    @RequestMapping("/toAdd")
    public String toAdd(){
        return "bookEdit";
    }

    @RequestMapping("/add")
    public String add(Book book){
        int insert = bookService.insert(book);
        System.out.println(insert);
        return "redirect:/book/list";
    }

    @RequestMapping("/toUpdate/{bid}")
    public String toUpdate(HttpServletRequest request ,@PathVariable(value="bid") Integer bid){
        Book book = bookService.selectByPrimaryKey(bid);
        request.setAttribute("book",book);
        return "bookEdit";
    }

    @RequestMapping("/update")
    public String update(Book book){
        int i = bookService.updateByPrimaryKey(book);
        return "redirect:/book/list";
    }
}

八、 @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定    

若name没有传值,不能打印出xxx come in ,只有当name传了值之后才能进来。

//用于前端框架要传的值
    @RequestMapping("/xxx")
    public String xxx(@RequestParam(value="name", required=true) String name){
        System.out.println("xxx come in");
        return "xxx";
    }

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值