SpringMVC
SpringMVC 实现了MVC,轻量级web框架
封装了Servlet共有的行为(参数封装,视图转发)
/web.xml/
<!-- DispatchServlet配置 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 应用程序启动加载配置文件 ,值是正整数-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--/匹配所有访问路径,不会匹配*.jsp,/*匹配所有,包括*.jsp -->
<url-pattern>/</url-pattern>
</servlet-mapping>
java web执行流程
tomcat服务器
- 接收请求,解析请求资源地址
- 创建request对象
- 创建response对象
- 调用目标资源,DispatchServlet调度分发给对应的controller
- 获得response中内容,组装http响应返回给客户端
SpringMVC执行流程
流程图解- 前端控制器(DispatchServlet)
- 处理器映射器(HandlerMapping)
- 处理器适配器(HandlerAdaptor)
- 处理器(Handler)
- 视图解析器(ViewResolver)
- 视 图页面 jsp
spring mvc三大组件�
处理器映射器(HandlerMapping)
处理器适配器(HandlerAdaptor)
视图解析器(ViewResolver)
<!--处理器映射器-处理器适配器功能增强;支持json读写 -->
<mvc:annotation-driven />
<!-- 视图解析器 -->`
<bean id="viewResolver class="xxx.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
RequestMapping 注解
// xxx/quick?accountName=tom
@RequestMapping(path=“/quick”,method=RequestMethod.GET,params={“accountName”})
public String findByName(String accountName)
获取参数
基本类型参数
get参数和controller中的参数名一致
对象参数
表单的name值和 java bean 属性一致
集合类型参数
集合参数包装到一个POJO中
自定义转换器
public class DateConverter implements Converter<String,Date> {
@Override
public Date convert(String s) {...}
}
/spring-mvc.xml/
<!--处理器映射器和适配器增强-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotationdriven>
<!-- 自定义转换器 -->
<bean id="conversionService" class="xxx.COnversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.lagou.DateConverter"/>
</set>
</bean>
/*
* @RequestParam,解决表单和控制器参数不一致
* url:xxx/?pageNo=2
*/
@RequestMapping("/findByPage")
public String findByPage(�@RequestParam(name="pageNo",defaultValue="1",required=false) Integer pageNum)
// 获取请求头 cookie信息赋值给 变量 cookie
public String requestHead(@RequestHeader("cookie") String cookie)
// 获取cokie中key= JSESSIONID的值 给变量 jessionId
public String cookieValue(@CookieValue("JSESSIONID") String jessionId)
响应
- 页面跳转
- 返回字符串逻辑视图
- void原始Servlet API,WEB-INF:安全目录,不允许外部请求直接访问目录资源,只可以进行服务器内部转发。
// 请求转发,不走视图解析器,foraward 后面跟全路径,
return “forward:/WEB-INFO/pages/success.jsp”;
// 跳转到控制器方法
return “forward:/product/products”;
// 重定向,不走视图解析器
return "redirect:/index.jsp";
// 页面取model的值 ${username}
public String forward(Model model) {
//底层使用request.setAttribute()
model.addAttribute("user","tom");
}
- ModelAndView
// 方式一
public ModelAndView returnModelView() {
ModelAndView modelAndView = new ModelAndView();
//设置模型数据
modelAndView.addObject("username", " lagou");
//设置视图名称
modelAndView.setViewName("success");
return modelAndView;
}
// 方式二
public ModelAndView returnModelView(ModelAndView modelAndView){...}
- 返回数据
- 直接返回字符串,response.getWriter().write(xxx)
- 对象或集合转json返回
@SessionAttributes
多个请求之家共享数据,作用于类上
// request域中 model中存入key 为 username时,同步到session中
@SessionAttributes("username")
静态资源访问
/spring-mvc.xml/
<!--放行全部静态资源-->
<mbc:defalut-servlet-handler/>
Spring MVC进阶
json
// @RequestBody,提交数据为json形式时,通过 HttpMessageConverter接口转换为对应的POJO对象。
@RequestMaping("/ajaxRequest")
@RequestBody //响应转为json
public void ajaxRequest(@RequestBody List<User> users) {
return users;
}
RESTful风格
@RequestMapping(value="/user{id}",method=RequestMethod.GET)
@ResponseBody // 直接响应,不会页面跳转
public String findById(@PathVariable Integer id) {
// @PathVariable获取占位符的值,占位符和参数名相同
return ”findById“;
}
@RestController // 组合@Controller和@ResponseBody
@GetMapping("/user/{id}") // @RequestMapping(value="/user{id}",method=RequestMethod.GET)
文件上传
- 表单项 type=”file“
- 提交方式 method=“POST”
- enctype=“multipart/form-data ”
<!--文件上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
<!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
<property name="maxInMemorySize" value="40960"></property> </bean>
// 单文件MultipartFile,多文件MultipartFile[]遍历数组依次保存
public String fileUpload(String username,MultipartFile filePic) {
// 上传的文件名
String original=filePic.getOriginalFilename();
filePic.transferTo(new File("/upload"+original));
}
Spring MVC异常处理
接口 HandleExceptionResolver(异常处理器)
/web.xml/
<!--处理500异常-->
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location> </error-page> <!--处理404异常--> <error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
拦截器(interceptor)
拦截器 过滤器区别
- 过滤器Servlet规范一部分,拦截器 springmvc框架
- 拦截器拦截访问的控制器方法,不拦截 .jsp html css js;过滤器配置 /* 拦截所有
public class MyInterceptor implements HandleInterceptor {
// 目标方法执行之前,return true 放行
public boolean preHandler()
// 目标方法执行之后,视图对象返回之前,获得Controller处理后的ModelAndView
public void postHandler()
// 流程都执行完(视图完成了跳转后)
public void afterCompletion()
}
/spring-mvc.xml/
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor> <!--对哪些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.lagou.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
Spring整合mybatis
<!--注解组件扫描--> <context:component-scan base-package="com.lagou.service"/>
<!--spring整合mybatis-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--SqlSessionFactory创建交给spring的IOC容器-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据库环境配置-->
<property name="dataSource" ref="dataSource"/>
<!--类型别名配置-->
<property name="typeAliasesPackage" value="com.lagou.domain"/>
<!--如果要引入mybatis主配置文件,可以通过如下配置-->
<!--<property name="configLocation"
value="classpath:SqlMapConfig.xml"/>-->
</bean>
<!--映射接口扫描配置,由spring创建代理对象,交给IOC容器-->
<!-- 对应SqlMapConfig.xml
<mappers>
<package name="com.lagou.dao"/>
</mappers>
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lagou.dao"/>
</bean>
spring整合 spring mvc
<!--spring 与 web容器整合-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
字段和属性名不一致?配置resultMap
网友评论