本帖最后由 小石姐姐 于 2018-8-30 21:17 编辑
【石家庄校区】就业班_JavaEE_SpringMVC
一 概述
springmvc是spring的一个模块,spring和springmvc 都会初始化上下文,相当于初始化二个容器。spring初始化的是父容器,springmvc初始化的是子容器 。
父容器不能访问子容器中的bean ,子容器可以访问父容器中的bean,一般通过spring容器来初始化service和dao 通过springmvc来初始化controller 。 事务则在spring容器中来实现。
二 mvc
mvc是一种设计模式,既可以用在c/s模式中,也可以用在b/s模式中。mvc模式在web项目中的应用:
c:控制器 struts2中的strutsprepareandexecutionfilter , springmvc中的dispatcheservlet
v:view jsp freemarker excle pdf 等
m:模型 service dao
三 springmvc原理
dispatherservlet 前端控制器 处理请求和响应
handlermapper 处理器映射器 接收请求uri 查找controller
handleradpater 处理器适配器 定位controller中的方法 执行handler 并返回modelandview
viewresolver 视图解析器 将modle中的数据封装到jsp中 ,并返回view
四 spring注解开发
@controller
@requestmapping
该注解可以用在方法上 也可以用在类上 该注解的二个属性 value 表示请求路径 method 表示请求方式的限定 如果不指定则get和post都可以。
注解开发会去扫描@controller下的@requestMapping中的value来匹配url
mapper包扫描
五 springmvc参数绑定
1 属性封装 在handler方法中 通过形参来接收 形参的名称要与页面中的name属性名称相同
当前台页面和handler方法中形参名称 不一致时,可以通过@RequestParam 来显示指定绑定
@RequestParam 中 value属性表示【指定请求参数中的名称】 required属性表示【是否必须】 defaultvalue属性表示【默认值】
2 模型封装 在handler方法中 通过pojo对象来封装,该方法适用于参数比较多时。 页面中的name属性名称要与pojo中的属性名称一致
3 表达式封装 在handler方法中 , 通过pojo对象来封装, 对于pojo中包含的pojo对象,在页面中通过user.name 这样的形式来传参
4 传递数组
a 在handler方法的形参上直接用String[] ids 进行接收。
b 用pojo类包装String[] ids 进行接收。
5 传递list
a 只能用pojo类包装List<Item> list 进行接收。步骤如下
1. 在后台定义一个pojo类包装list , 在handler方法中用包装的pojo进行接收参数
2. 前台表单中name的定义 user.contactList[x].telephone 七 全局异常处理
1 自定义全局异常处理器 实现handlerexceptionresolver接口
2 在springmvc配置文件中 配置该异常bean
异常处理思路,业务层的异常由业务层抛出,其它都有web层抛出,最终抛给distpatcherserlvet,调用我们自定义的全局异常处理类做统一处理。
六 handler方法返回值
1 modelandview
2 void 通过response进行响应
3 字符串
七 全局异常处理
1 自定义全局异常处理器 实现handlerexceptionresolver接口
2 在springmvc配置文件中 配置该异常bean
异常处理思路,业务层的异常由业务层抛出,其它都有web层抛出,最终抛给distpatcherserlvet,调用我们自定义的全局异常处理类做统一处理。
八 springmvc文件上传
1 导包 fileupload io
2 springmvc配置文件解析器类
<!-- 文件上传 -->
[Java] 纯文本查看 复制代码 <bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
3 后台handler中通过MultipartFile 来接收上传的文件
该类提供二个方法:
getOriginalFilename() 得到上传文件的名称
transferTo(File 上传文件在服务器端存放的文件名) 相当于将上传的临时文件进行拷贝
4 可以通过配置tomcat的虚拟路径来模拟图片服务器
九 springmvc对json的支持
1 spring支持json需要导入jackson的jar包支持。
2 使用<mvc:annotation-driven /> 方法 不用配置json的适配器
请求参数 @requestbody 只能用在方法参数上
响应结果 @responsebody 可以用在方法上也可以用在类上。 用来类上相当于所有方法上都进行了配置
// 商品修改提交json信息,响应json信息
[Java] 纯文本查看 复制代码 @RequestMapping("/editItemSubmit_RequestJson")
public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {
System.out.println(items);
//itemService.saveItem(items);
return items;
}
十 restful支持
1 restful是一种编程风格,主要体现在二个方面:
a 资源定位【uri表示网络上的一种资源,没有参数,用名词表示】
b 资源操作【get post delete put】get 表示查询 put表示修改 post 表示添加 delete表示删除
2 如果springmvc要支持restful风格,需要修改webxml中的 *.action 为 /
<servlet-mapping>
<servlet-name>springmvc-servlet-rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
需要注意:/* 表示拦截jsp / 不拦截jsp 如果配置为/*拦截jsp,则会找不到对应的handler,会报404错误。
3 请求单一参数
前台请求:
[Java] 纯文本查看 复制代码 /item/viewItems/1
后台处理:
@RequestMapping("/viewItems/{id}")
public @ResponseBody viewItems(@PathVariable("id") String id,Model model) throws Exception{
//方法中使用@PathVariable获取useried的值,使用model传回页面
//调用 service查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(id);
return itemsCustom;
}
4 请求多个参数
前台请求url:'${pageContext.request.contextPath }/testjson/1/zhangshan'
后台处理:
@RequestMapping(value="testjson/{id}/{name}")
@PathVariable("id") Integer id,@PathVariable("name") String name
5 当使用/配置时,将对静态资源也进行拦截,需要配置放行。
<mvc:resources location="/js/" mapping="/js/**"/>
location表示静态资源在服务器端真实路径 mapping表示静态资源在页面中的引用地址。/** 二个* 表示包含js下的子文件夹。
十一 拦截器
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对handler进行预处理和后处理。
拦截器都实现HandlerInterceptor接口。
preHandle 方法执行时机:handler执行前,
postHandle 方法执行时机:handler执行中,handler执行但未返回视图前
afterCompletion 方法执行时机:handler执行后,handler执行后且视图返回
拦截器执行顺序总结:
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用
|