一、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> <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";
}