• springmvc基本使用及总结


    springmvc复习:
    1.SpringMVC介绍
    2.SpringMVC入门程序

    	1)创建web工程
    	2)导入jar包
    	3)在web.xml中配置前端控制器(指定上下文件的路径 classpath:springmvc.xml)
    		*.do(*.action)拦截以do结尾的  /拦截所有(不包含jsp)  /*拦截所有
    	4)springmvc.xml配置扫描@controller注解
    	5)Action Controller Handler处理器 程序员书写的 类上@Controller
    		方法上@RequestMapping(value=请求的路径) .action可省略
    		public ModelAndView itemList(){
    			new ModelAndView
    			设置数据
    			设置jsp页面的路径 /WEB-INF/demo.jsp
    		}			
    

    3.SpringMVC架构分析 (一个中心,三个基本点,两个开发)

    	前端控制器  (由springmvc提供)
    	处理器映射器  处理器适配器  视图解析器  (由springmvc提供)
    	Handler处理器  jsp视图  (由程序员书写)		
    

    4.springmvc原理

    	1)用户请求到前端控制器
    	2)前端控制器让处理器映射器根据rul去找具体的处理器中请求映射的路径,对应的方法,
    		返回找到的方法(包名+类名+方法名)
    	3)前端控制器通过处理器适配器调用处理器去执行此方法(执行前绑定参数),返回ModelAndView 
    	4)前端控制器让视图解析器去解析ModelAndView,返回具体View
    	5)前端控制器对View进行渲染视图(即将模型数据填充至视图中)
    	6)前端控制器渲好的html响应给用户	
    

    5.默认的三大组件(前两个废弃了,采用下面的这两个)

    	RequestMappingHandlerMapping
    	RequestMappingHandlerAdapter
    	<mvc:anonation-driver/>注解驱动--可替代上面两大组件
    	InternalResourceViewResolver视图解析器:优化前缀及后缀		
    

    6.整合MyBatis
    整合思想:

    		1)SqlMapConfig.xml  mybatis配置文件
    			别名
    		2)applicationContext.xml  spring配置文件
    			数据源(c3p0,dbcp,druid):读取db.properties(创建db.properties文件)
    			mybatis的会话工厂(SqlSessionFactory)
    			mybatis的mapper 动态代理开发扫描-基本包
    			[开启事务,扫描@service]
    		3)创建springmvc.xml文件
    			扫描基本包(com.spring)  此包下controller,service全扫描
    			手动配置三大组件
    		4)web.xml文件
    			配置监听器读取applicationContext.xml上下文
    			配置前端控制器读取springmvc.xml
    			配置post提交乱码(Filter过滤器)				
    

    6.参数绑定
    1)默认参数绑定

    		Request  Response  Session  Model(接口)->ModelMap(实现类)
    

    2)简单类型参数绑定

    		方法的形参上(@RequestParam("name")Integer/String/Double/Boolean...)
    		表单参数与形参一致(不一致可以用@RequestParam注解)
    

    3)pojo类型

    		方法的形参上(@ModelAttribute("user")User user)
    		表单参数与实体属性一致
    		可以使用@ModelAttribute注解:将请求参数封装到对象user中,并以key=user存储到request作用域中
    

    4)QueryVo包装类(里面item)

    		表单参数与包装类中item对象的属性一致
    		QueryVo vo.item(实体属性)  --  item.name(表单参数)
    

    5)自定义参数类型 转换日期 2018:12_16 15:00_12

    		①.springmvc.xml里配置转换器的工厂  
    		②.converters -> list/set/array -> <bean class="自定义转换器类"/>
    			<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    				<!-- 配置多个转换器-->
    				<property name="converters">
    					<list>
    						<bean class="com.springmvc.conversion.DateConveter"/>
    					</list>
    				</property>
    			</bean>
    		③.创建自定义转换器类
    			实现Converter<S,T> S:页面传递过来的类型 T:转换后的类型				
    

    7.SpringMVC中控制层类

    	1)入口是一个servlet,即前端控制器
    	2)单例模式(基于方法开发,请求参数传递到方法的形参)
    	3)请求参数是形参(不能是成员变量)
    	4)mav.addObject()只能存到request作用域中		
    

    8.参数绑定高级参数:

    	数组:页面选中多个checkbox向controller方法传递
    		Controller方法中可以用Integer[]/String[]接收,或者pojo的Integer[]/String[]属性接收
    	集合:List中存放对象,并将定义的List放在包装类QueryVo中
    		private List<Item> itemList;
    		表单name属性必须是list属性名+下标+元素属性
    		${status.index}	输出行号,从0开始。
    		${status.count}	输出行号,从1开始
    		begin、end、step分别表示:起始序号,结束序号,跳跃步伐		
    

    9.@RequestMapping注解
    1.url路径映射

    		value值是数组,可以将多个url映射到同一个方法
    		@RequestMapping(value = { "itemList", "itemListAll" })
    

    2.窄化路径

    		在class上添加@RequestMapping(url)指定通用请求前缀
    

    3.请求方法限定

    		限定GET方法
    		@RequestMapping(method = RequestMethod.GET)
    		限定POST方法
    		@RequestMapping(method = RequestMethod.POST)
    		GET和POST都可以
    		@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})
    

    10.Controller方法返回值
    1.返回ModelAndView

    		controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view
    

    2.返回void

    		在Controller方法形参上可以定义request和response,使用request或response指定响应结果
    		1)request.getRequestDispatcher("页面路径").forward(request, response);
    		2)response.sendRedirect("url")
    		3)response.getWriter().print("{"abc":123}");
    

    3.返回字符串

    		1)逻辑视图名
    			指定逻辑视图名,经过视图解析器解析为jsp物理路径
    			return "itemList";
    		2)Redirect重定向
    			return "redirect:/itemEdit.action?itemId=" + item.getId();
    		3)forward转发
    			return "forward: /itemEdit.action";
    	
    	1.ModelAndView  无敌的   带着数据  返回视图路径  (不建议使用)
    	2.String   返回视图路径  model带数据  (官方推荐此种方式 解耦 数据 视图 分离 MVC)  建议使用  
    	3.void   ajax  请求 合适 json格式数据 (response 异步请求使用)
    

    重定向后浏览器地址栏变更为重定向的地址,
    重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
    如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

    使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
    转发并没有执行新的request和response,所以之前的请求参数都存在

    11.异常处理器
    1)系统中异常包括两类:预期异常和运行时异常RuntimeException。
    2)系统的dao、service、controller出现都通过throws Exception向上抛出,
    最后由springmvc前端控制器交由异常处理器进行异常处理
    3)步骤:

    		a.自定义异常类(MyException)
    		b.自定义异常处理器(CustomHandlerException)(实现异常处理器HandlerExceptionResolver)
    		c.异常处理器配置(将自定义异常处理器注入到spring容器)
    		d.编写错误页面(error.jsp)			
    

    12.上传图片
    1)配置虚拟目录

    		在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:
    		<Context docBase="E:mysourceupload	emp" path="/pic" reloadable="false"/>
    

    2)加入jar包

    		commons-fileupload-1.2.2.jar
    		commons-io-2.4.jar
    

    3)配置上传解析器(springmvc.xml)

    		<!-- 文件上传,id必须设置为multipartResolver -->
    		<bean id="multipartResolver"
    			class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    			<!-- 设置文件上传大小 -->
    			<property name="maxUploadSize" value="5000000" />
    		</bean>
    

    4)设置表单可以进行文件上传

    		enctype="multipart/form-data"
    

    5)图片上传(形参:MultipartFile pictureFile)

    		// 设置图片名称,不能重复,可以使用uuid
    		String picName = UUID.randomUUID().toString();
    		// 获取文件名
    		String oriName = pictureFile.getOriginalFilename();
    		// 获取图片后缀
    		String extName = oriName.substring(oriName.lastIndexOf("."));
    		// 开始上传
    		pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));
    		// 设置图片名到商品中
    		item.setPic(picName + extName);
    		// 更新商品
    		this.itemService.updateItemById(item);		
    

    13.json数据交互
    1)@RequestBody

    		@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口
    			将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上
    

    2)@ResponseBody

    		@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口
    			转换为指定格式的数据如:json,xml等,通过Response响应给客户端
    

    3)springmvc支持json包

    		jackson-annotations-2.4.0.jar
    		jackson-core-2.4.2.jar
    		jackson-databind-2.4.2.jar
    

    4)发送json字符串

    		$(function(){
    			var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';			
    			$.ajax({
    				type : "post",
    				url : "${pageContext.request.contextPath }/json.action",
    				data : params,
    				contentType : "application/json;charset=UTF-8",//发送数据的格式
    				success : function(data){
    					alert(data.name);
    				}
    				dataType : "json",//回调
    			});
    		});
    

    5)json测试

    		@RequestMapping("testJson")
    		public @ResponseBody Item testJson(@RequestBody Item item) {
    			return item;
    		}			
    

    14.RESTful支持
    1.Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格.
    2.从url上获取商品id,步骤如下:

    		1)使用注解@RequestMapping("item/{id}")声明请求的url
    		  {xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
    		2)使用(@PathVariable() Integer id)获取url上的数据
    			@RequestMapping("item/{id}")
    			@ResponseBody
    			public Item queryItemById(@PathVariable() Integer id) {
    				Item item = this.itemService.queryItemById(id);
    				return item;
    			}
    		注:如果@RequestMapping中表示为"item/{id}",id和形参名称一致,@PathVariable不用指定名称。
    			如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")
    

    3.注意两个区别:

    		1).@PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
    		2).如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,返回目前的json数据。
    			如果不加,就走视图解析器,返回页面		
    

    15.拦截器
    1)定义拦截器(实现HandlerInterceptor接口)

    		public class MyHandlerInterceptor implements HandlerInterceptor{
    			@Override
    			public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    				// 从request中获取session
    				HttpSession session = request.getSession();
    				// 从session中获取username
    				Object username = session.getAttribute("username");
    				// 判断username是否为null
    				if (username != null) {
    					// 如果不为空则放行
    					return true;
    				} else {
    					// 如果为空则跳转到登录页面
    					response.sendRedirect(request.getContextPath() + "/user/toLogin.action");
    					return false;
    				}
    			}
    		}
    

    2)在springmvc.xml中配置拦截器

    		<!-- 配置拦截器 -->
    		<mvc:interceptors>
    			<mvc:interceptor>
    				<!-- 配置商品被拦截器拦截 -->
    				<mvc:mapping path="/item/**" />
    				<!-- 所有的请求都进入拦截器 -->
    				<!-- <mvc:mapping path="/**" /> -->
    				<!-- 配置具体的拦截器 -->
    				<bean class="com.springmvc.interceptor.MyHandlerInterceptor" />
    			</mvc:interceptor>
    		</mvc:interceptors>
    

    拦截器总结:

    		preHandle按拦截器定义顺序调用
    		postHandler按拦截器定义逆序调用
    		afterCompletion按拦截器定义逆序调用
    
    		postHandler在拦截器链内所有拦截器返成功调用
    		afterCompletion只有preHandle返回true才调用(当第一个拦截器为不为true时都不会调用)
  • 相关阅读:
    eclipse里面自动添加get和set方法
    初探内联方式的 onload="doSomething()"为何要加"()"?而js代码的 onload="doSomething" 和 addEventListener 为何不加"()"?
    ubuntu下安装git,sublime,nodejs
    ajax学习计划
    ajax学习笔记
    滑动窗口思路精髓总结
    Java给定一个字符串,分割字符串使得每个子字符串都是回文串,求最少分割次数
    顺时针打印
    戳气球最少需要几下一样的题
    ip覆盖算法
  • 原文地址:https://www.cnblogs.com/itzlg/p/10699276.html
Copyright © 2020-2023  润新知