SpringMVC--全部

来源:互联网 发布:淘宝退款骗局过程 编辑:程序博客网 时间:2024/06/10 06:10

springmvc 第一天 springmvc的基础知识

 

课程安排:

 

第一天:springmvc的基础知识

什么是springmvc

springmvc框架原理(掌握)

前端控制器处理器映射器处理器适配器视图解析器

springmvc入门程序

目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习

非注解的处理器映射器、处理器适配器

注解的处理器映射器、处理器适配器(掌握)

springmvcmybatis整合(掌握)

 

springmvc注解开发:(掌握)

常用的注解学习

参数绑定(简单类型、pojo、集合类型(明天讲))

自定义参数绑定(掌握)

springmvcstruts2区别

 

第二天:springmvc的高级应用

参数绑定(集合类型)

数据回显

上传图片

json数据交互

RESTful支持

拦截器

 

springmvc框架

1.1 什么是springmvc

springmvcspring框架的一个模块,springmvcspring无需通过中间整合层进行整合。(struts2Spring整合的时候需要借助单独的jar包)

springmvc是一个基于mvcweb框架。

 

 

 

 

 

1.2 mvcb/s系统 下的应用

 

mvc是一个设计模式,mvcb/s系统 下的应用:

 

 

1.3 springmvc框架

 

 

第一步:发起请求到前端控制器(DispatcherServlet) –中央调度,负责request,response,查找handler,请求执行handler处理器适配器,视图解析,视图渲染。有了前端控制器,降低了各个组件的耦合,系统扩展性提高

第二步:前端控制器请求HandlerMapping查找Handler

可以根据xml配置、注解进行查找(按照一定规则)

第三步:处理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

ModelAndViewspringmvc框架的一个底层对象,包括Modelview

第八步:前端控制器请求视图解析器去进行视图解析(主要是解析View)

根据逻辑视图名解析成真正的视图(jspFreeMarker)

补充:

jsp和freeMarker是两种不同的技术, 
jsp需要访问的时候访问Dao层抓取数据,生成html页面,返给浏览器。
freeMarker则是提前根据模板生成好html的静态页面,这样在访问时,直接访问到的就是一个静态页面,这个就是效率问题了,不过freeMarker适合用变化不大,但是内容很多的网页。

 

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染

主要是将Model中的数据填充到View

第十一步:前端控制器向用户响应结果

 

 

 

 

组件:

1、前端控制器DispatcherServlet(不需要程序员开发)

作用接收请求,响应结果,相当于转发器,中央处理器。

有了DispatcherServlet减少了其它组件之间的耦合度。

 

2、处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的url查找Handler

 

 

3、处理器适配器HandlerAdapter

作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

 

4、处理器Handler(需要程序员开发)

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

 

5、视图解析器View resolver(不需要程序员开发)

作用:进行视图解析,根据逻辑视图名解析成真正的视图(view

 

6、视图View(需要程序员开发jsp)

View是一个接口,实现类支持不同的View类型(jspfreemarkerpdf...

 

 

 

 

入门程序:

前置:引入springmvc单独jar包即可

1 配置前端控制器:

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>

  

  

  <!-- springMVC前端控制器-->

  <servlet>

   <servlet-name>springMVC</servlet-name>

   <!--spring-webmvc-4.1.3.核心包下的第一个包org.springframework.web.servlet的第二个类-->

   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

   <!--contextConfigLocations用于配置springmvc加载的配置文件(出其里映射器、适配器等等)  

  如果不配置contextConfigLocations,则默认加载/WEB-INF/下的servlet-servlet.xml(springmvc-servlet.xml)

  -->

   <init-param>

   <param-name>contextConfigLocation</param-name>

   <param-value>classpath:springmvc.xml</param-value>

   </init-param>

  

  </servlet>

  

  <servlet-mapping>

   <servlet-name>springMVC</servlet-name>

   <!--

  1 *.action :.action结尾的地址由DispatcherServlet解析

  2 /   :所有地址都由DispatcherServlet解析 ,但是对于静态文件的解析(图片、html..)需要配置不让DispatcherServlet进行解析

  注意  /*  是错的

   -->

   <url-pattern>*.action</url-pattern>

  </servlet-mapping>

 

1.5 src下或者新建的一个源文件夹(config)下:新建springmvc.xml(<param-value>classpath:springmvc.xml</param-value>对应)

<?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:context="http://www.springframework.org/schema/context"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://code.alibabatech.com/schema/dubbo

        http://code.alibabatech.com/schema/dubbo/dubbo.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

        

 

</beans>

2写处理器类(相当于struts2Action)

/**

 * 实现Controller接口的处理器

 *

 * @author Administrator

 *

 */

public class TestController1implements Controller {

 

@Override

public ModelAndView handleRequest(HttpServletRequest arg0,

HttpServletResponse arg1) throws Exception {

// 调用service..dao...查询 模拟静态数据

List<User_tb> ulist = new ArrayList<User_tb>();

ulist.add(new User_tb(1,"校长!!!","",new Date(), "重庆"));

ulist.add(new User_tb(2,"美女","",new Date(), "湖南"));

ulist.add(new User_tb(3,"帅锅","",new Date(), "重庆"));

//返回ModelAndView

ModelAndView modelAndView =new ModelAndView();

//相当于request.setAttribute  将来在jsp页面中通过key取值

modelAndView.addObject("ulist", ulist);

//指定视图 路劲写 /+视图  ,不能是/根目录+视图   原因:转发

modelAndView.setViewName("/spview1.jsp");

return modelAndView;

}

}

 

 

 

3 springmvc.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:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://code.alibabatech.com/schema/dubbo

        http://code.alibabatech.com/schema/dubbo/dubbo.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

        

 <!-- 配置Handler -->

<bean  name="/TestController1.action" class="com.controller.TestController1" />

        

      

<!--

处理器映射器    beanname作为url进行查找,需要在配置Handler时指定beanname(就是url

所有的映射器都实现 HandlerMapping接口。

 -->

<bean

class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!-- 处理器适配器 -->

<bean

class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!-- 视图解析器  默认使用jstl,如果是其他开发工具,得保证拥有jstl的包(myeclipse自带)-->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>

4 编写jsp  --view1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title></title>

  </head>

  <body>

    <table border="1">

     <tr>

     <Td>id</Td>

     <Td>姓名</Td>

     <Td>性别</Td>

     <Td>生日</Td>

     <Td>地址</Td>

     </tr>

     <c:forEach items="${ulist }" var="i">

     <tr>

     <Td>${i.id }</Td>

     <Td>${i.name }</Td>

     <Td>${i.sex }</Td>

     <Td>${i.birthday }</Td>

     <Td>${i.address }</Td>

     </tr>

     </c:forEach>

    </table>

  </body>

</html>

 

 

5测试:开启Tomcat,然后http://localhost:8080/springMVC/TestController1.action

 

 

 

 

 

 

 

 

非注解的处理器映射器  (springmvc.xml)

 

处理器映射器:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping (以上的例子用的就是这个)

 

 

另一个映射器:

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

 

<!-- 配置Handler -->

<bean id="testController1"  name="/TestController1.action" class="com.controller.TestController1" />

    <!--简单url映射  -->

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<props>

<!-- 进行url映射,key为映射地址,值为beanid,会根据id找到  com.controller.TestController1-->

<prop key="/TestController2.action">testController1</prop>

<prop key="/TestController3.action">testController1</prop>

</props>

</property>

</bean>   

<!--

处理器映射器    beanname作为url进行查找,需要在配置Handler时指定beanname(就是url

所有的映射器都实现 HandlerMapping接口。

 -->

<bean

class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 

分别测试url地址为 :

http://localhost:8080/springMVC/TestController1.action

http://localhost:8080/springMVC/TestController2.action

http://localhost:8080/springMVC/TestController3.action

发现都映射到了TestController1这个处理器中去,表明多个映射器可以并存

 

注意:所有的映射器都实现了HandlerMapping接口

 

 

非注解的处理器适配器(springmvc.xml)

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter  (以上的例子用的就是这个)

要求编写的Handler实现Controller接口

 

 

另一个适配器:

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

要求编写的Handler实现 HttpRequestHandler接口

步骤:

1

 

<!-- 处理器适配器 -->

<bean

class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

<!-- 另一个非注解的适配器 -->

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

 

2:新建TestController2处理器类implements HttpRequestHandler

public class TestController2implements HttpRequestHandler{

 

@Override

public void handleRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 调用service..dao...查询 模拟静态数据

List<User_tb> ulist = new ArrayList<User_tb>();

ulist.add(new User_tb(1,"校长!!!","",new Date(), "重庆"));

ulist.add(new User_tb(2,"美女","",new Date(), "湖南"));

ulist.add(new User_tb(3,"帅锅","",new Date(), "重庆"));

request.setAttribute("ulist", ulist);

request.getRequestDispatcher("/view1.jsp").forward(request, response);

}

}

 

3 配置映射器

<!-- 配置Handler -->

<bean id="testController1"  name="/TestController1.action" class="com.controller.TestController1" />

<bean id="testController2"  class="com.controller.TestController2" />

    <!--简单url映射  -->

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<props>

<!-- 进行url映射,key为映射地址,值为beanid,会根据id找到  com.controller.TestController1-->

<prop key="/TestController2.action">testController1</prop>

<prop key="/TestController3.action">testController1</prop>

<prop key="/TestController4.action">testController2</prop>

</props>

</property>

</bean>    

      

<!--

处理器映射器    beanname作为url进行查找,需要在配置Handler时指定beanname(就是url

所有的映射器都实现 HandlerMapping接口。

 -->

<bean

class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

 

 

4 测试:重启服务;访问:http://localhost:8080/springMVC/TestController4.action

 

 

发现问题:以上不管是哪种

 

使用该方法可以写特殊的需求:比如返回json格式(需要response

//响应客户端

PrintWriter out= response.getWriter();

out.print(str);

 

 

 

总结:映射器是独立的, 适配器和处理器是有关联的,

SimpleControllerHandlerAdapter 适配器的Handler类需要实现Controller接口

HttpRequestHandlerAdapter适配器的Handler类需要实现HttpRequestHandler接口

但不管是哪一种:都只能在Handler类中写一个方法,不适用!!

 

 

如果就算我们把 springmvc.xml中的的映射器、适配器、视图解析器删除,一样可以执行

因为在下面路径中有个属性文件:打开后发现默认有配置

 

 

 

 

 

 

 

 

 

 从这里开始是工作中的应用,以上全是原理

注解的处理器映射器和适配器

从以上打开的properties文件中可以查到过期的(default)注解适配器和映射器:

 

spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。

 

spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。

 

spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。

 

spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

 

 

 

<!-- 注解映射器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

<!-- 注解适配器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!-- 使用mvc:annotation-driven代替上边两个注解映射器和注解适配器,而且该方法默认加载了很多参数的绑定方法(json的转换方式..) 实际开发使用该方法 -->

<mvc:annotation-driven></mvc:annotation-driven>

 

 

 

 

注解的处理器(Handler)开发步骤:

前提:使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用

 

1 Handler类中自定义方法:无需实现接口

/**

 * 实现Controller接口的处理器

 *

 * @author Administrator

 *

 */

//使用注解Controller标识它是一个控制器 ,注意由于这是springMVC模块了不能使用@Component,用了则报错

@Controller

public class TestController3  {

/**

 *查询所有客户

 *@RequestMapping:实现让url和方法进行映射,一个方法对应一个url

 *一般建议将url和方法名写成一样,方便维护,他们本身是没有关系的

 */

@RequestMapping("/findAllUsers.action")

public ModelAndView findAllUsers(){//方法名自定义,而且可以在该controller中写其他方法了,比如增删改查

//调用service..dao...查询 模拟静态数据

List<User_tb> ulist = new ArrayList<User_tb>();

ulist.add(new User_tb(1,"校长!!!","",new Date(), "重庆"));

ulist.add(new User_tb(2,"美女","",new Date(), "湖南"));

ulist.add(new User_tb(3,"帅锅","",new Date(), "重庆"));

//返回ModelAndView

ModelAndView modelAndView =new ModelAndView();

//相当于request.setAttribute  将来在jsp页面中通过key取值

modelAndView.addObject("ulist", ulist);

//指定视图 路劲写 /+视图  ,不能是/根目录+视图

modelAndView.setViewName("/view1.jsp");

return modelAndView;

}

}

 

 

配置springmvc.xml

 

 

 

<!-- 配置Handler -->

<!--

对于注解的Handler可以单独配置,而且不需要写id,因为在Handler类中已经配置了url(id就是用来配置url)

但在实际开发中使用组件扫:一般扫描controller,service...

-->

<!-- <bean class="com.controller.TestController3" /> -->

<context:component-scan base-package="com.controller"></context:component-scan>

 

注意:这里必须要扫描或单独配置Handles类完整的路径,因为注解已经不是以前的@Component(回顾:@Component注解相当于beanid以及class=包名+类名),而@Controller注解不包含class=+

 

3 测试:重启服务:http://localhost:8080/springMVC/findAllUsers.action

 

 

视图解析器配置前缀和后缀

springmvc.xml:

<!-- 视图解析器  默认使用jstl,如果是其他开发工具,得保证拥有jstl的包(myeclipse自带)-->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

<!-- 配置jsp路径前缀 -->

<property name="prefix" value="/" />

<!-- 配置jsp路径后缀 -->

<property name="suffix" value=".jsp" />

</bean>

 

Handler类中:

modelAndView.setViewName("view1");//以前是/view1.jsp,/.jsp已经配置好了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击