springmvc详解

springmvc

后端控制器的实现方式

  1. 可以实现Controller接口实现后端控制器类---适配器是SimpleController...,重写handleRequest方法,返回值是ModelAndView.需要利用此类的addObject来添加模型数据---此数据最后转到域对象中,默认是转发或者包含(因为WEB-INF是受保护的文件夹,只有转发或者包含才可以访问),所以数据存入request域对象在这里映射器,适配器和视图解析器我们也可以省略不写,只需要写后端控制器即可,mvc自带配置文件中有默认值,如果我们没有写系统会执行默认设定.注解模式连后端控制器也可以不写,配置文件中写扫描注解的标签即可.

  2. 可以实现HttpRequestHandler接口实现后端控制器---适配器是HttpRequestHandler...与实现controller接口一样也是重写了handleRequest方法,但是返回值是void.                                             这种方法相当于原生态的Servlet,使用原生态的响应方式的时候,不再经过视图解析
  3. 任意类的方式---主要是借助注解 后端控制器类需要2个注解,一个是控制层注解,因为控制层我们也没有配置,当然我们也可以选择在spring.xml中选择配置后端控制器, 还有一个是映射器注解,用来匹配指定请求和指定方法.

后端控制器中方法的返回值类型

  1. ModelAndView同上

  2. void同上

  3. String返回的是逻辑视图的url地址,前端控制器根据返回的url找到指定页面

  4. 在视图解析器中可以设置前缀和后缀,提取共同的部分,此方式不适合返回值为void的原生态的servlet,因为他通过转发返回地址值,不会经过视图解析器

  5. 任意类型---一般是实体类、包装类、集合

    1. 需要json包,Jackson---进行json和对象的转换
    2. springmvc默认使用Jackson包(jsonlib)
    3. 添加jquery.js文件
    4. 准备页面,ResponseBody注解的作用是调用Jackson功能,他也是通过mvc配置文件中的annotation-driven才生效的
      package com.offcn.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      import com.offcn.bean.Person;
      
      @Controller
      public class AjaxController {
      
      	@RequestMapping("/ajax.action")
      	//这个注解的作用是调用Jackson功能将此处返回的对那个转换为json串,这个注解的加载和RequestMapping
      	//一样都是通过配置文件中的mvc:annotation-driven生效的
      	@ResponseBody
      	public Person ajax() {
      		Person person = new Person();
      		person.setPid(10010);
      		person.setMoney(1000.0);
      		person.setPname("沙和尚");
      		return person;
      	}
      }

       

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>异步请求</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
	login.....
	<hr>
	<p>实现异步请求</p>
	<button id="btn">异步请求</button>
	<script type="text/javascript">
		$(function() {
			$("#btn").click(function() {
				$.ajax({
					url : "ajax.action",
					dataType : "json",//json会将返回的字符串转换为对象
					type : "post",
					cache : false,
					//发送给服务器数据的格式,默认值是这个,和form表单中的encType一样
					contentType : "application/x-www-form-urlencoded",
					success : function(data) {
						console.log(data);//打印到浏览器控制台
					},
					error : function() {
						alert("error");
					}
				});
			});
		});
	</script>
</body>
</html>

如何实现重定向操作

重定向也可以理解为二次转发,服务器接收到客户端请求时只返回一个新的路径给客户端, 客户端根据这个新的路径发送二次请求给服务器, 服务器根据这个新的地址找到指定页面返回给客户端, 所以客户端的地址栏中的url才发生了变化.

重定向用到的是redirect关键字,格式是 redirect:新的url 

传参

  1. springmvc的配置文件,默认位置是在WEB-INF下,默认名称的格式:servlet-name标签中的名称加上中划线加上servlet组成的名称,例如:DispatcherServlet-servlet.xml
  2. spring的配置文件默认是applicationContext.xml
  3. 简单的类型---int、String等参数的传递,页面中参数的名称和处理请求的方法的形参名称一致,框架会自动帮我们匹配,其实底层还是通过request.getparameter()来实现的.     

    1. get请求如果出现中文乱码,如何处理?tomcat8以前会有get请求中文乱码,但是tomcat8之后就不存在这个问题了
      String name = request.getParameter(“name”);
      name = new String(name.getBytes("iso8859-1"),"utf-8");
      System.out.println(name);

       

    2. post请求是存在乱码的,如何解决? --- 添加过滤器直接用会存在乱码,添加过滤器解决filter-class的从下面这个class中找    
    3. 在页面设置了一个新的字段--传递日期,到方法中添加形参接收数据                                                                     

      在springmvc中日期类型,从页面向后台送的时候,springmvc无法解析,所以出现400问题;

      解决:可以自定义一个解析器--类型转换器;也可以添加注解

      1. 自定义类型转换器---------首先先定义转换器类,然后在前端控制器配置文件中创建转换器工厂,然后在<mvc:annotation-drive>添加属性conversion-service="??"值就是转换器工厂的id值

        package com.offcn.converter;
        
        import java.text.ParseException;
        import java.text.SimpleDateFormat;
        import java.util.Date;
        
        import org.springframework.core.convert.converter.Converter;
        
        public class DateConverter implements Converter<String, Date> {
        
        	@Override
        	public Date convert(String str) {
        		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        		Date date = null;
        		try {
        			date = sdf.parse(str);
        		} catch (ParseException e) {
        			e.printStackTrace();
        		}
        		return date;
        	}
        
        }

        转换器工厂的class地址为:

      2. 注解实现类型转换. 上面的方式太麻烦了,我们一般用注解实现,或者更简单的,我们用String来接受日期即可.配置文件无需更改
    4. 页面的传递数据key=value,key保持和方法中形参同名;如果不同名,要添加注解@RequestParam,有value属性、defaultValue属性、required属性.  value属性用来设置页面中参数的key名defaultValue属性用来设置默认值(在分页的时候比较常用),意思是当页面没有送来此属性值的时候,那么这个属性所对应的形参的值就是默认值, required属性用来设置是否必须传递值
    5. 传递的参数封装到对象中
      1. 准备实体类,我们把注解加载实体类上
      2. 准备页面
      3.  执行单元
    6. 页面传参传递集合

      1. 数组.  在实现CRUD操作的时候  select * from student where id in(1,3,5,10);
      2. list集合

        要实现批量修改,把多个对象的数据传到后台. 批量修改的格式

        批量修改---需要一次向后台送多个对象过去

        页面需要修改---将值直接显示到文本框定义一个包装的类型,用来把页面传来的数据封装成对象保证每一组都是同一个对象的数据,用数组下表来确定同一个对象 执行单元

    7. 总结:实现的是从页面到后台的传递参数:简单类型要求同名如果不同名需要加注解;对象封装数据;List集合封装数据不需要同名.

从后台到页面传参数

  1. ModelAndView可以实现addObject(key,value);---转存到request域对象;此对象传参方式适合于方法返回值就是它自己
  2. request.setAttribute(key,value)可以实现向页面传递参数;此方式适合于方法返回值为void
  3. Model接口和ModelMap实现类---也可以传参到页面,此方式适合于方法的返回值为String.
    1. 使用model接口:我们只需要在形参上写出model即可,后面直接用,实现类对象框架会帮我们创建
      package com.offcn.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import com.offcn.bean.Person;
      
      @Controller
      public class ModelController {
      
      	@RequestMapping("/model.action")
      	//我们只要写出model接口就可以了,实现类对象框架会帮我们创建
      	public String model(Model model) {
      		Person person = new Person();
      		person.setPid(1111);
      		person.setPname("atutu");
      		
      		model.addAttribute(person);
      		return "model/model2";
      	}
      }

    2. 使用ModelMap实现类,可以直接使用,和model基本相同

  4. 异步传参---异步请求通过@ResponseBody将对象转为json串,再由异步引擎将数据接收回到页面

注解@CookieValue

作用是从cookie中获取值;先有cookie,然后才能获取出来值

实现:

  1. 先创建cookie---服务器端, 页面<a href="cookie.action">提交发出</a>
  2. 响应时送回去
  3. 再次请求时,又送回来
package com.offcn.controller;

import java.io.IOException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CookieController {

	@RequestMapping("/cookie.action")
	public void createCookie(HttpServletRequest request,HttpServletResponse response) throws IOException {
		//创建cookie
		Cookie co = new Cookie("name","阿兔兔");
		//响应时将cookie送回
		response.addCookie(co);
		response.sendRedirect("cookie.jsp");
	}
	
	//二次响应
	@RequestMapping("/second.action")
	public String getCookie(@CookieValue(value = "name")String cookie) throws IOException {
		System.out.println(cookie);
		return null;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值