栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC小结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC小结

Spring MVC

Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

优点缺点 优点
  • 多视图共享一个模型,大大提高了代码的可重用性
  • MVC 三个模块相互独立,松耦合架构
  • 控制器提高了应用程序的灵活性和可配置性
  • 有利于软件工程化管理

通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。

缺点
  • 原理复杂
  • 增加了系统结构和实现的复杂性
  • 视图对模型数据的低效率访问
两个核心

**处理器映射:**选择使用哪个控制器来处理请求
**视图解析器:**选择结果应该如何渲染

通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。

主要组件

前端控制器(DisatcherServlet):接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)。
处理器映射器(HandlerMapping):根据URL去查找处理器,一般通过xml配置或者注解进行查找。
处理器(Handler):就是我们常说的controller控制器啦,由程序员编写。
处理器适配器(HandlerAdapter):可以将处理器包装成适配器,这样就可以支持多种类型的处理器。
视图解析器(ViewResovler):进行视图解析,返回view对象(常见的有JSP,FreeMark等)

运行原理
  1. 用户发送请求到前端控制器(DispatcherServlet)。
  2. 前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。
  3. 找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。
  4. 前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。
  5. 处理器适配器去执行Handler。
  6. 处理器执行完给处理器适配器返回ModelAndView。
  7. 处理器适配器向前端控制器返回ModelAndView。
  8. 前端控制器请求视图解析器(ViewResolver)去进行视图解析。
  9. 视图解析器向前端控制器返回View。
  10. 前端控制器对视图进行渲染。
  11. 前端控制器向用户响应结果。
常用的注解
  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。
  • @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
  • @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
  • @Conntroller:控制器的注解,表示是表现层,不能用用别的注解代替
配置springmvc.xml



    
    
    
    
    	    
         
    
    
配置web.xml


  
  
    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
    
      encoding
      UTF-8
    
    
    
      forceEncoding
      true
    
  

  
    CharacterEncodingFilter
    /*
  

  
  
    DispatcherServlet
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath:springmvc.xml
    
      
    1
  

  
    DispatcherServlet
    /
  
  
    
    index.html
  

获取前端数据
  • 通过原生HttpServletRequest获取前端参数
@RequestMapping("/方法名")
    public String 方法名(HttpServletRequest req){
        字段类型 字段名=req.getParameter("页面name");
        return "返回页面";
}
  • 前端页面参数和Controller方法参数名一致/不一致的获取方式
@RequestMapping("/方法名")
    public String 方法名(String username,String password){
        System.out.println(username + " " + password);
        return null;
}
  • 通过对象接收前端参数(包含对象类型参数和集合类型参数)中文乱码的配
@RequestMapping("/方法名")
    public Object 方法名(@RequestParam(name="username") String username,@RequestParam("password") String password){
        System.out.println(username + " " + password);
        return null;
}
  • 时间类型参数的转换问题 ConversionServiceFactoryBean的配置

    //第一种,实体类注解实现
    //时间类型
    @DateTimeFormat(pattern = "yyyy-mm-dd")
    private Date time;
    
    //第二种,时间类型转换的类
    public class TimeUtil implements Converter{
        @Override
        public Date convert(String s){
            if(StrUtil.isEmpty(s)){
                //①,通过SimpleDateFormat
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                        try {
                            return simpleDateFormat.parse(stringDate);
                        } catch (ParseException e) {
                            e.printStackTrace();
                }
    
                //②通过工具类实现
                DataTime time=DataUtil.parse(s,"yyyy-mm-dd");
                return time;
            }
        }
    }
    
    
            
                
                    
                
            
    
    
  • 地址栏传参(针对RestFul 风格请求路径)

@RequestMapping("/方法名/{username}/{password}")
    public Object 方法名(@PathVariable("username") String username, String password){
        System.out.println(username + " " + password);
        return null;
}
  • 配置静态文件的支持(html、js、image、css…)

  • 异步加载(结合注解ResponseBody使用)
	@RequestMapping("/方法名")
    @ResponseBody   //局部刷新
    public Object 方法名(String username,String password){
        Map map=new HashMap<>();
        if(StrUtil.isEmpty(username)){
            map.put("type","error");
            map.put("msg","用户名不能为空");
            return map;
        }
        if(StrUtil.isEmpty(password)){
            map.put("type","error");
            map.put("msg","密码不能为空");
            return map;
        }
        map.put("type","success");
        map.put("msg","登陆成功");
        return map;
	}

	$(funciton(){
      	$("#btn").click(function(){
        	//取出输入框的值
        	var username=$("#username").val();
        	var password=$("#password").val();
        	//发送ajax异步请求
        	$.ajax({
                url:'/方法名',
                type:'post',
                Datatype:'json',
                data:'username{username:username,password:password}',
                success:function(da){
                    if(da.type=='success'){
                        alert(da.msg);
                    }else{
                        alert(da.msg);
                    }
                }
            })
        	
    	})
    })
账号:
密码:
后台传值到前台
  • 使用ModelAndView传值(普通值和map集合)

    @RequestMapping("/方法名")
    public ModelAndView 方法名(ModelAndView model){
    	model.addAttribute("name","xxx");
        model.addAttribute("name",new User("xxxx"));
        Map map=new HashMap<>();
        map.put("qqq",111);
        model.addAllObjects(map);
        model.setViewName("跳转的页面");
        return model;
    }
    
  • 使用Model传值

@RequestMapping("/方法名")
public String 方法名(Model model){
	model.addAttribute("name","xxx");
    model.addAttribute("name",new User("xxxx"));
    Map map=new HashMap<>();
    map.put("qqq",111);
    model.addAllAttributes(map);
    return "页面";
}
  • 使用普通对象(javabean对象传值)默认提示根据配置返回的jsp页面
@RequestMapping("/方法名")
public User 方法名(User user){
    user.setPassword("qqq");
    user.setUsername("aaa");
    return user;
}
  • 使用redirect和forward的使用 ,跳过视图解析器 例如:redirect:/hello.jsp
@RequstMapping("方法名")
public String 方法名(Model model){
    model.addAttribute("msg","王五");
    return "redirect:页面";
}
登录控制层

一般来说,一个项目中,只有一个类上不写rm映射路径

为了方便处理一些单个的业务

PS:我本人也是在学习中,后续学到的新的知识,都会逐步更新。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/532127.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号