SpringMVC
DispatcherServlet包含了spring的启动过程
WEB-INF中的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>
<display-name>Archetype Created Web Application</display-name>
<!-- <!–防止加载事务出错–>-->
<!-- <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>-->
<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:applicationContext.xml</param-value>
</init-param>
<!--项目启动时,就启动servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--/*代表所有的请求都过springmvc
/*.do代表只.do过DispatcherServlet
-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.yau.test"></context:component-scan>
<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/db_zbmanager?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="2643258587"></property>
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<bean id = "mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yau.test.mapper"></property>
</bean>
</beans>
@Controller 将这个类交给Spring容器加载
@RequestMapping("/User") 请求映射地址
get请求与post请求区别:一个参数在请求地址上,post在请求头上,所以post更加的安全,对于敏感的数据,必须用post请求
视图解析器ViewResolver处理内容的过程:
1、客户端向web服务器(如tomcat)发送一个http请求,web服务器对http请求进行解析,解析后的URL地址如果匹配了DispatcherServlet的映射路径(通过web.xml中的servlet-mapping配置),web容器就将请求交给DispatcherServlet处理。
2、DispatcherServlet接收到这个请求后,再对URL进行解析,得到请求资源标识符(URI)。然后调用相应方法得到的HandlerMapping对象,再根据URI,调用这个对象的相应方法获得Handler对象以及它对应的拦截器。(在这里只是获得了Handler对象,并不会操作它,在SpringMVC中,是通过HandlerAdapter对Handler进行调用、控制的)
3、DispatcherServlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其实例对象,执行拦截器中的preHandler()方法。
4、在拦截器方法中,提取请求中的数据模型,填充Handler入参,所以所有准备工作都已做好,开始执行Handler(我们写的controller代码并不是能被直接执行,需要有刚才那些操作,才能转变为Handler被执行)。
5、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。
6、这个ModleAndView只是一个逻辑视图,并不是真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。
7、DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图。将得到的最终视图通过http响应返回客户端。
@ResponseBody的作用将java对象转为json格式的数据。
没有进行配置前,只能传字符串,不能解析对象
@ResponseBody
public String login(User user) {
User result = service.login(user);
return result.getId() +"";
}
返回对象给前端,解析对象的方法:
一,加入三个包:com.alibaba.fastjson、com.fasterxml.jackson.core.jackson-core、com.fasterxml.jackson.core.jackson-databind
二、applicationContext.xml中
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注解驱动,则可使用@ResponseBody-->
<mvc:annotation-driven></mvc:annotation-driven>
防止静态页面被映射的方法:
①:在web.xml中
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--/*代表所有的请求都过springmvc
*.代表只.do过DispatcherServlet,来过滤请求
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
②:applicationContext.xml中
<!--若将静态资源都放入static文件夹中,防止给接口映射-->
<mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
向前端发送数据:
①直接发送
@ResponseBody
public String login(User user) {
User result = service.login(user);
return result.getId() +"";
}
②重定向过程,登录成功则定向到html:
@RequestMapping("/login.do")
public String login(User user) {
User result = service.login(user);
if (result != null){
return "redirect:/static/index.html";
}else {
return "redirect:/static/error.html";
}
}
③转发
返回什么都不加为String
返回、带数据为ModelAndView
@RequestMapping("/login.do")
public ModelAndView login(User user) {
User result = service.login(user);
ModelAndView mav = new ModelAndView();
mav.addObject("result",result);
mav.setViewName("success");
return mav;
}
协助返回数据的东西叫视图解析器:
一个为资源解析InternalResourceViewResolver
一个为UrlBasedViewResolver解析,解析一个链接,手动单个试图解析配置:
<bean id="viewResovler" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<!--前置-->
<property name="prefix" value="/jsp/"></property>
<!--后置-->
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>
提供一个方便的标签:
<mvc:view-resolvers>
<mvc:jsp prefix="/jsp/" suffix=".jsp" view-class="org.springframework.web.servlet.view.JstlView" ></mvc:jsp>
</mvc:view-resolvers>
一般为UrlBased解析,解析一个链接,访问链接
在WEB-INF中的jsp不可以直接访问,只能通过转发来访问