SpringMVC

SpringMVC的使用

很乱,只是想留着自己以后可以看看的,看了很多的文章来的,不知道算是转载还是什么。

Spring是用一种容器来做,定义接口,对于实现并不关心把实现交给别人。

 

MVC模式是软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View),控制器(Controller)。通过分层是开发结构更加的清晰。

(1)DispatcherServlet是Spring MVC的核心,它的本质是实现HttpServlet,通过在web.xml配置<servlet-mapping>实现对request的监听。

(2)(3)当接收到request的时候,DispatcherServlet根据HsndlerMapping的配置,调用相应的controller来对request进行业务处理

(4)返回一个ModelAndView对象

(5)(6)DispatcherServlet根据ViewResolver的配置将view转换成真正要显示的View,如JSP

 

RequestàDispatchetServletàControlleràViewResolveràviewàresponse

 

DispatcherServlet作为前置控制器是web服务器的入口,是springmvc最重要的一个类,通过他的生命周期可以加深对web服务器的理解。

Servlet的生命周期

1.初始化阶段   调用inin()方法。

2.响应客户请求阶段   调用service()方法

3.终止阶段   调用destroy()方法

 

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

DispatcherServlet是前置控制器,配置在web.xml文件中。

拦截匹配的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。

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

   <web-app> 

       <servlet> 

           <servlet-name>example</servlet-name> 

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

           <load-on-startup>1</load-on-startup> 

       </servlet> 

       <servlet-mapping> 

           <servlet-name>example</servlet-name> 

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

       </servlet-mapping> 

   </web-app> 

<load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动。

<url-pattern>*.form</url-pattern>会拦截*.form结尾的请求。

 

在DispatcherServlet的初始化过程中,框架会在web应用的WEB-INF文件夹下寻找名为

[servlet-name]-servlet.xml的配置文件,生成文件中定义的bean。

 

   <servlet> 

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

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

       <init-param> 

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

           <param-value>classpath*:/springMVC.xml</param-value> 

       </init-param> 

       <load-on-startup>1</load-on-startup> 

   </servlet> 

   <servlet-mapping> 

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

       <url-pattern>/</url-pattern> 

   </servlet-mapping> 

指明了配置文件的文件名,不使用默认的配置文件名,而使用SpringMVC.xml配置文件。

其中<param-value>**.xml</param-value>这里可以有很多的写法

1.不写,使用默认值::/WEB-INF/<servlet-name>-servlet.xml

2. <param-value>/WEB-INF/classes/springMVC.xml</param-value>

3.<param-value>classpath*:springMVC-mvc.xml</param-value>

4. 多个值用逗号分隔

 

一般拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。

所有的请求都会被DispatcherServlet处理,但是被拦截下来的请求会被发送给相关控制器

Servlet拦截匹配规则可以自己定义,拦截那种URL合适?

当映射为@@RequestMapping("/user/add")时

1.      拦截*.do、*.htm。例如:/user/add.do

2.      拦截/  ,例如:/user/add

3.      拦截*/  这是一个错误的方式

 

Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器)保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。

DispatcherServlet是一个Servlet,可以同时配置多个,每个DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文的内容,但是父上下文不能访问子上下文的内容。保存在 ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名称

@Controller 声明Action组件
@Service    声明Service组件    @Service("myMovieLister")
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时.
@RequestMapping("/menu")  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype")   设定bean的作用域

 

 

如何访问静态文件:

<!-- 不拦截静态文件 --> 

<servlet-mapping> 

   <servlet-name>default</servlet-name> 

   <url-pattern>/js/*</url-pattern> 

   <url-pattern>/css/*</url-pattern> 

   <url-pattern>/images/*</url-pattern> 

   <url-pattern>/fonts/*</url-pattern> 

</servlet-mapping> 

方案一:通过激活tomcat的defaultservlet来处理静态文件

 

   <servlet-mapping>  

       <servlet-name>default</servlet-name> 

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

   </servlet-mapping>   

   <servlet-mapping>      

       <servlet-name>default</servlet-name>   

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

   </servlet-mapping>   

   <servlet-mapping>       

       <servlet-name>default</servlet-name>      

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

   </servlet-mapping>   

    要配置多个,每种文件配置一个  

要写在DispatcherServlet的前面,让defaultServlet先拦截请求

 

方案二:在spring3.0.4以后版本提供了mvc:resources

   <!-- 对静态资源文件的访问 -->   

   <mvc:resources mapping="/images/**"  location="/images/" /> 

 

方案三,使用<mvc:default-servlet-handler/>

 

 

<!-- ViewResolver --> 

<beanclass="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>

nternalResourceViewResolver:用于支持Servlet、JSP视图解析;

    viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包;

    prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”;

 

具体流程

1)*.jsp网页生成一个请求,如<ahref=""></a>

 

2)然后由前端控制器匹配,过滤或者拦截

 

3)然后把拦截的request请求发送给控制器

 怎么发给控制器由其实是从@RequestMapping("/test")中的/test来与请求匹配控制其中方法。

4)方法会返回一个页面,另一个jsp。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值