发表于: 2017-07-24 21:16:12
1 1070
今天做的事:
所谓磨刀不误砍柴工,今天花了大量时间在深入理解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框架的大量知识,对于它有了一个初步比较全面的了解
评论