发表于: 2017-07-24 21:16:12

1 1072


今天做的事:

所谓磨刀不误砍柴工,今天花了大量时间在深入理解springMVC,获得了一定成效。


首先先说一个概念

对象-关系映射(Object/Relation Mapping,简称ORM

对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。


接下来开始讲springMVC,这里贴上我看的链接,讲的很好:http://blog.csdn.net/bestone0213/article/details/43155239

使用Spring MVC,配置DispatcherServlet是第一步。

DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。

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

“某某规则”:是根据你使用了哪个HandlerMapping接口的实现类的不同而不同。

在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。


说一下springMVC的流程

首先,指定SpringMVC的入口程序(在web.xml中)

以一个Servlet作为入口程序是绝大多数MVC框架都遵循的基本设计方案。这里的DispatcherServlet被我们称之为核心分发器,是SpringMVC最重要的类之一。在SpringMVC中,核心分发器就是org.springframework.web.servlet.DispatcherServlet。 

核心分发器:提炼一个核心的Servlet覆盖对所有Http请求的处理。

DispatcherServlet还需要完成不同协议之间的转化工作(从Http协议到Java世界的转化)。


然后,编写SpringMVC的核心配置文件(在[servlet-name]-servlet.xml中)


再然后,编写控制(Controller)层的代码 

控制(Controller)层的代码编写在一个Java文件中。我们可以看到这个Java文件是一个普通的Java类并不依赖于任何接口。只是在响应类和响应方法上使用了Annotation的语法将它与Http请求对应起来。


之后就是service和dao层的具体实现了


总结下来,构成基于SpringMVC应用程序的最基本要素。它们分别是: 

入口程序 —— DispatcherServlet

核心配置 —— [servlet-name]-servlet.xml

控制逻辑 —— UserController


我们在web.xml文件中对servlet进行定义和一系列配置

在Servlet模型中,请求-响应的实现依赖于两大元素的共同配合: 

1.配置Servlet及其映射关系(在web.xml中)

<url-pattern>定义了整个请求-响应的映射载体:URL;而<servlet-name>则将<servlet>节点和<servlet-mapping>节点联系在一起形成请求-响应的映射关系;<servlet-class>则定义了具体进行响应的Servlet实现类。 

2. 在Servlet实现类中完成响应逻辑 

Servlet实现类本质上是一个Java类。通过Servlet接口定义中的HttpServletRequest对象,我们可以处理整个请求生命周期中的数据;通过HttpServletResponse对象,我们可以处理Http响应行为。 


Servlet中的两大核心方法init方法和service方法,它们的运行时间和触发条件都截然不同: (这部分没有能够完全理解)

1. init方法 

在整个系统启动时运行,且只运行一次。因此,在init方法中我们往往会对整个应用程序进行初始化操作。这些初始化操作可能包括对容器(WebApplicationContext)的初始化、组件和外部资源的初始化等等。 

2. service方法 

在整个系统运行的过程中处于侦听模式,侦听并处理所有的Web请求。因此,在service及其相关方法中,我们看到的则是对Http请求的处理流程。 


Servlet的这一特性就被SpringMVC用于对不同的逻辑职责加以划分,从而形成两条互不相关的逻辑运行主线:

初始化主线 —— 负责对SpringMVC的运行要素进行初始化

Http请求处理主线 —— 负责对SpringMVC中的组件进行逻辑调度完成对Http请求的处理


web.xml文件中有两个常用的部分

<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:(这个是一定要用到的,定义Controller时就必须有它作为先决条件)

@Controller 声明Action组件

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

@Repository 声明Dao组件

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

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

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

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

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

@Scope("prototype") 设定bean的作用域


另一个是

<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。(对于这一个暂时没有深入了解,只是用默认配置)


最后,处理流程规范化的首要内容就是考虑一个通用的Servlet响应程序大致应该包含的逻辑步骤: (这个逻辑便于理解springMVC的工作流程)

步骤1 —— 对Http请求进行初步处理,查找与之对应的Controller处理类(方法)

步骤2 —— 调用相应的Controller处理类(方法)完成业务逻辑

步骤3 —— 对Controller处理类(方法)调用时可能发生的异常进行处理

步骤4 —— 根据Controller处理类(方法)的调用结果,进行Http响应处理

述的四个流程也就被定义为了四个不同接口,它们分别是: 

步骤1 —— HandlerMapping

步骤2 —— HandlerAdapter

步骤3 —— HandlerExceptionResolver

步骤4 —— ViewResolver


最后,通过查阅资料懂得建立maven web项目,并且成功访问jsp页面

以下是一个简单的helloworld的小项目

项目结构


web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<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/javaeehttp://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 MVC配置 -->
 <!-- ====================================== -->
 <servlet><!--用来声明一个servlet的数据 -->
   <servlet-name>spring-mvc</servlet-name> <!--指定servlet的名称-->
   <servlet-class><!--指定servlet的类名称,这里配置了前端控制器-->
     org.springframework.web.servlet.DispatcherServlet
</servlet-class>
   <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/spring-mvc-servlet.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup><!--当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.-->
 </servlet>
 
 <servlet-mapping><!--用来定义servlet所对应的URL-->
   <servlet-name>spring-mvc</servlet-name><!--指定servlet的名称-->
   <url-pattern>/</url-pattern><!--指定servlet所对应的URL-->
 </servlet-mapping>

 <!-- Spring配置 -->
 <!-- ====================================== -->


 <!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下  -->
 <context-param><!--全局范围内环境参数初始化-->
   <param-name>contextConfigLocation</param-name><!--参数名称-->
   <param-value>/WEB-INF/root-context.xml</param-value><!--参数取值-->
 </context-param>


 <!--例:spring监听器-->
 <listener><!--用来设定Listener接口-->
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><!--定义Listener的类名称-->
 </listener>


</web-app>


spring-mvc-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:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      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.1.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-4.1.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

   <!-- 3、自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器  -->
   <!-- 设置使用注解的类所在的jar包 -->
   <context:component-scan base-package="com.yiibai.springmvc"/>

   <!-- 1、配置映射器与适配器 -->
   <mvc:annotation-driven></mvc:annotation-driven>

   <!-- 启用spring mvc 注解 -->
   <context:annotation-config/>


   <!-- 2、视图解析器 -->
   <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <!-- 前缀和后缀 -->
       <property name="prefix">
           <value>/WEB-INF/pages/</value>
       </property>

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


root-context.xml(在本项目中无任何作用,但可以用来配置spring的bean配置文件)

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

   <!-- Empty -->

</beans>


HelloWorldController.java

package com.yiibai.springmvc;

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

/**
* Created by Administrator on 2017/07/22.
*/
@Controller
public class HelloWorldController {
@RequestMapping("/hello")// 请求url地址映射
   public String hello(Model model){
// model.addAttribute("greeting","Hello Spring MVC");/*这段注解是为了验证页面展示内容是否从这里赋值,确实是*/

       return "helloworld";
   }
}


helloworld.jsp

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset= UTF-8">
   <title>Spring MVC -HelloWorld</title>
</head>
<body>
<h1>Hello?</h1>
</body>
</html>


然后也解决了如何运行springMVC框架的maven项目这个问题

首先,将代码什么的全部写好后,对运行进行一番配置


点击左上角绿色+号,进入如下界面,操作如图



然后进行配置完成,就可以使用Tomcat来运行这个maven项目了 


接下来运行后,进入maven web项目的自带index.jsp


然后是输入之前写的helloworld.jsp的url


明天计划:明天尝试写任务要求的REST风格的springMVC框架的代码,具体看情况


遇到问题:对springMVC的了解有待提高,不过以后再说,重点先完成任务


收获:springMVC框架的大量知识,对于它有了一个初步比较全面的了解


返回列表 返回列表
评论

    分享到