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。