发表于: 2017-11-02 22:04:16

1 767


今日完成的事情:

老老实实搞清问题………

;spring的主要构件及作用

1;applicationContext.xmlSpring的核心配置文件;

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

作用:注入bean,Spring 容器初始化的时候,会扫描package下的所有,标有 (@Component,@Service,@Controller,@Repository后三个继承了com) 注解的类,也就是说在类上使用上面四种注解,会声明他们是bean,然后会被纳入spring容器管理


再对比一下用到的实例,简单说一下四个注解

@Component 泛指组件,当组件不好归类的时候,用这个注解标注,比如这个仅仅是简单的测试,这个类没有业务逻辑,就可以用component

这里也测试了一下,实际上就是一个注解形式,只识别这四个词,用哪个都可以注入bean,只是定义四个足够应对java的层级和类,我也测试了,即使把注解component换成其他的也一样可以,换成servicecontroler都没问题


然后说一下具体分类规范;

@Service用于标注业务层组件; 


@Controller用于标注控制层组件;


@Repository 用于标注数据访问组件,DAO组件,这个好像没用到过…….


2;注解的标识符,作用;注入对象,装配属性

<context:annotation-config />

@Autowired 是按类型进行装配, @Resource 是根据nametype,自动匹配对应的bean装配,这个暂时用的不多.;作用就是实现属性的自动装配,也即是实例化对象的时候会获得这个被atuowired的属性


3;然后spring的配置文件里就剩下bean的定义,各种bean的定义,放到spring的容器里,等着程序运行再被需要的时候被注入


;springmvc的主要构件及作用

1;首先说web.xml配置文件,springmvcweb项目所有会有一个管理web的配置文件,大体上是全局掌控项目,具体作用:

比较重要的映射,也就是提供路径与servlet的映射关系例如把/hello这个路径,映射到 HelloServlet这个类上,这也是web.xml里为什么会有servletservletmapping的原因,然后具体说一下我用到的配置的作用

 

</servlet>
<
servlet-mapping>
  <
servlet-name>mvc-dispatcher</servlet-name>
  <
url-pattern>/</url-pattern>

 

2, DispatcherServlet;这个在不考虑过滤器什么的,就可以看作是Spring MVC的入口,会把所有的请求都先提交到该Servlet,然后又他分配到相应的类去调用方法,处理问题

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

 

3; ContextLoaderListener这个作用就是去初始化spring的配置文件;webap启动的时候,会自动获取contextConfigLocation配置文件的文件名applicationContext.xml,进行Spring初始化的内容

<context-param>
  <
param-name>contextConfigLocation</param-name>
  <
param-value>classpath:applicationContext.xml</param-value>
</
context-param>
<
listener>
<
listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</
listener>

 

4;看的很清楚,上面是初始化spring的配置文件!!!而中央处理器的里面有mvc的配置文件,两者是同时存在的,这里就先说一点,就是之前我单独做的时候,这个mvc的配置文件是放在WEB-INF下面,对比之前的web配置文件,就没有初始化着个内容;因为默认情况下,SpringWEB-INF目录下去寻找配置文件,而在ssm项目里这个配置文件,为了方便统一,都放到resource;这个时候就必须初始化,web.xml中必须有init然后去到src目录下去寻找MVC配置文件

<init-param>
  <
param-name>contextConfigLocation</param-name>
  <
param-value>classpath:springMVC.xml</param-value>
</
init-param>

 

5;再说中文过滤器,这个没仔细看,作用知道,前面也做了小例子,当时解决中文乱码,很麻烦request.setCharacterEncoding("UTF-8");而且每个Servlet中都要增写上,繁琐,这就是过滤器的作用体现, Filter过滤器进行中文处理,只需要放到访问路径的必经之路,而且必须放到进入中央控制之前,否则过滤就失效了,那个时候访问已经发出了

<filter-mapping>
  <
filter-name>CharacterEncodingFilter</filter-name>
  <
url-pattern>/*</url-pattern>
</
filter-mapping>

6;小结一下;上面说了web.xml配置文件,也就是说执行完那个配置文件之后,剩下的就是,把请求交给SpringMVC框架处理了,所以需要需要配置mvcxml文件;整体来看,不说那些过滤器内容,ssm这个web项目肯定会用到springMVC,所以这样来看的话,这个web.xml配置文件里肯定会有两个内容,一个就是初始化spring的配置文件(mybatis的配置被加到这里了),一个是初始化mvc的配置文件;第一个配置文件初始化是通过ContextLoaderListener完成,mcv的配置文件是通过中央处理器内的<init-param>块执行的;这也恰恰是web.xml的作用体现

 

7;上面说了为什web.xml会那样配置,用到了的springmvc的配置,spring的配置文件已经说了;现在说mvc的配置

A;视图解析器

bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <
property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <
property name="prefix" value="/WEB-INF/jsp/"/>
    <
property name="suffix" value=".jsp"/>
</
bean>

简单来说这段代码的意思,就是把视图定位到/WEB/INF/jsp 这个目录下,而实际上涉及原理太多了,总结一句话的话就是,视图解析器的作用是将逻辑视图转为物理视图;列举一下解析流程:

1、调用目标方法,SpringMVC将目标方法返回的StringViewModelMap或是ModelAndView都转换为一个ModelAndView对象;

2、然后通过视图解析器(ViewResolver)对ModelAndView对象中的View对象进行解析,将该逻辑视图View对象解析为一个物理视图View对象;

3、最后调用物理视图View对象的render()方法进行视图渲染,得到响应结果。

 

B;然后是spring的这个<context:component-scan>

<context:annotation-config/>
<
context:component-scan base-package="com.jnshu.controller">
    <
context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</
context:component-scan>

作用就是spring可以自动去扫描base-pack包下面的java文件,如果扫描到有@Component @Controller@Service上面说的四种注解的类,就把这些类注册为bean,纳入容器被管理.这里有个疑点????????就是componen不是包含了annotion???不知道为什么还要写,我注释掉好像也没关系….百度也是说可以去掉,那就是规范了吧..

 

1.然后说一下子标签<context:include-filter>准确来说是一对还有这个<context:exclude-filter>;作用的话就是限制;先说component标签,有一个use-default-filters属性,默认为true,这就意味着会扫描指定包下的全部的标有@Component四个标签的类, 并注册成bean,这样来看就是扫描范围太大,因为有时候只是像注册controller,这样的话,这一对标签就可以用了;简单描述<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描.

 

2.然后是标签<mvc:annotation-driven />注解驱动,

<mvc:annotation-driven/>

开头就是mvc,百度了一下是一种简写形式,目的是让初学都快速应用默认配置方案。大概是<mvc:annotation-driven /> 会自动注册成为两个bean DefaultAnnotationHandlerMapping(用来将Request请求URL到映射到具体Controller)AnnotationMethodHandlerAdapter(用来将具体请求映射到具体方法) ,总的来说就是这两个bean,spring MVC@Controllers这个控制器来分发处理请求所必须的,也就是说由@Controllers标识的中央控制器的运行,需要这两个bean,就像用到的上面的@RequestMapping. 所以需要这个mvc自动注册,通过简写.

 

3.标签<mvc:default-servlet-handler />相当于筛选

<mvc:default-servlet-handler/>

简单来说就是一个检查员,对进入DispatcherServletURL进行筛查,如果发现是静态资源的请求,就将请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,由DispatcherServlet继续处理.为什么要过滤? 因为REST风格的资源URL不希望带 .html .do 等后缀.但是早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往使用 *.do *.xhtml等方式。这就导致请求URL必须带后缀了,而无法采用真正的REST风格的URL

<servlet-mapping>
  <
servlet-name>mvc-dispatcher</servlet-name>
  <
url-pattern>/</url-pattern>
</
servlet-mapping>

而若是将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求,包括静态资源的请求,Spring MVC会将它们当成一个普通请求处理,找不到对应处理器将导致错误.用这个标签来筛选就可以了

 

; springmvc的执行流程

1. 首先浏览器上访问路径2. tomcat根据web.xml上的配置信息,拦截,过滤器,转码,然后进入DispatcherServlet,加载了mvc的配置文件。3. Mvc框架根据springMVC的配置,将请求交Controller类进行处理,进行类的实例化4. 实例化Controller之后调用方法获取数据 5,最后在展示在中视图层显示数据



;springspringmvc的关系及应用,

1.关系Spring框架的核心是IOC容器,就是用来管理Bean;而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,这就会有上下层关系,像SSm项目就引入SpringSpringMVC这两个框架也就是两个容器,关系为Spring父容器,SpringMVC子容器;联系就是Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的;简单说就是子容器可以看见父容器中的注册的Bean,反之就不行。

2.应用官方推荐根据不同的业务模块来划分不同容器中注册不同类型的BeanSpring父容器负责所有其他非@Controller注解的Bean的注册,而SpringMVC只负责@Controller注解的Bean的注册,使得他们各负其责、明确边界。

这是mvc

<!--扫描Controller,并将其生命周期纳入Spring管理-->
<!-- SpringMVC
容器中只注册带有@controller注解的Bean -->
<context:annotation-config/>
<
context:component-scan base-package="com.jnshu.controller">
    <
context:include-filter type="annotation"

这是springmvc

<!--通过注解,将Service的生命周期纳入Spring的管理-->
<!-- Spring
容器中注册非@controller注解的Bean -->
<context:annotation-config />
<
context:component-scan base-package="com.jnshu.service" />

 

,jetty学习,简单说与tomcat类似,web服务器,更轻量级,市场小点,各有优缺

先是下载本地



然后类似与tomcat的配置


部署运行,出错了…..

解决了,jetty好像必须用到mvn项目,不管是下载pom依赖,还是用本地的jetty


明日计划的事情:

1;总结,把任务一和任务二只是连一块

2;从新做一份restful的架构

3;与师兄讨论一下,查找不足的地方弥补

4;任务三开个头吧



遇到的问题及解决方法:

主要是根据师兄提出的问题,总结,查找,搞清问题流程.



收获:

1;对于springmvc的配置文件有了更深度的认识学习

2;ssm流程也清晰了更多

3;学习态度和方式的转变,学习的状态自己最清楚,不自欺欺人,知识点的掌握程度自己也最清楚.

 



返回列表 返回列表
评论

    分享到