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

核心类和注解——springMVC入门介绍(一)

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

核心类和注解——springMVC入门介绍(一)

前言

springMVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架,它本身就是Spring框架的一部分。也可以认为是在Spring IOC和AOP基础上,提供的WEB开发模块。完成功能上与struts2相同,但比struts2更容易使用。springmvc为web应用开发者提供了一个前端控制器及处理映射器,无需开发额外的控制器对象,同时框架能够自动绑定用户输入,正确的转换数据类型及用户输入校验等,开发后端控制器(controller或handler)更符合开发人员的开发习惯。提高了开发效率。springMVC开发功能职责如下图所示:

一般的开发人员只需关注具体View、具体的Controller及service、持久化操作,数据的接收、请求与controller方法映射、参数转换等由spring框架完成,开发人员只需经过简单的配置即可。

springMVC项目核心类及配置

springMVC提供核心类前端控制器(DispatcherServlet)、处理器映射器(HanderMapping)、处理器适配器(HanderAdapter)和视图解析器(ViewResolver)。开发人员只需要做好这些核心类的配置。
前端控制类的配置在web.xml文件中,其配置内容如下:


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

  
    springmvc
     
    /
  

处理器映射器dispactherServlet受理请求后,通过处理器映射器建立请求与Handler之间的映射关系;处理器适配器是根据特定的规则去执行Handler,需要在SpringMVC.xml文件中做如下配置:

    
    
      

使用注解配置方式时,这两个配置可以进一步简化,由下面配置代替


视图解析器根据逻辑视图名生成真正的视图,真实的视图由路径+视图名+后缀构成。视图解析器也配置在在SpringMVC.xml文件中,具体配置如下。


        
        
        
        

另外,还需要将handler(也就是开发人员写的controller)要生成的对象交spring容器进行管理,完整的springMVC配置文件如下:


    
    
    
    
    
        
        
        
        
    

在springmvc中还需要开发人员根据业务编写具体的视图(如:jsp)和后端控制器(也就是controller)两种类型的代码,这个已经不属于框架的范畴,属于具体的业务逻辑。

springmvc的注解

springmvc最核心的注解是@Controller和@RequestMapping。前者用于指示Spring类的实例是一个控制器,标注在类上;后者用于建立用于建立URL请求与Controller中方法映射关系,标注在方法上。示例如下:

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv= new ModelAndView("/show.jsp");
        mv.addObject("hhh","hhhhhhhhh");
        mv.addObject("msg","欢迎使用springmvc开发web项目");
        mv.addObject("fun","执行的是doSome方法");
        return mv;
    }
}

代用此方法的URL路径变更为:http://localhost:8080/webapp/hello/firstController
@RequestMapping也可以标注到类上,起到窄化映射路径的作用,如下:

@Controller
@RequestMapping(value="/hello")
public class FirstController{
    //当只有一个value参数时,value可以省略
    @RequestMapping("firstController")
    public String handleRequest(HttpServletRequest request,
                                HttpServletResponse response, Model model) throws Exception {
        // 向模型对象中添加数据
        model.addAttribute("msg", "这是我的第一个Spring MVC程序www");
        // 返回视图页面
        return "index";
    }
}

此时对应的URL路径变更为:http://localhost:8080/webapp/hello/firstController
另外,@RequestMapping还提供了一些属性,用于限制URL请求,如:

@Controller
@RequestMapping(value="/hello")
public class FirstController{
    
    
    @RequestMapping(value = "firstControllerWithparam",params = {"username!=李四","pwd"})
    public String handleRequest2(HttpServletRequest request,
                                HttpServletResponse response, Model model) throws Exception {

       String username= request.getParameter("username").toString();
        // 向模型对象中添加数据
        model.addAttribute("msg", username+ "这是我的第一个Spring MVC程序www");
        // 返回视图页面
        return "index";
    }
 }

此时请求中必须包含username和pwd两个参数,如果不包含则返回404,上代码中,请求中的参数不仅要包含username和pwd,而且username的值不能是李四。

号外:@RequestMapping的变身组合注解,如限制某一映射必须是get请求,则代码写法为:

    @RequestMapping(value="user",method=RequestMethod.GET)
    public String selectUserById(){
    ...
    }

所谓的组合注解,就是无需写method=RequestMethod.GET,将@RequestMapping注解换成@GetMapping

    @GetMapping(value="user")
    public String selectUserById(){
    ...
    }

组合注解包括:

前端与后端数据交互

使用传统的servlet开发时,前后端之间数据的交互主要由HttpServletRequest和HttpServletResponse完成的。使用 springMVC后,前端数据可以通过各种形式的形参将前端的数据交给controller执行方法,而controller也可以通过各种形式的返回值,将处理的结果传送给页面展示。这一部分我们使用一个商品增、删、改、查示例进行介绍。
第一步:创建SpringMVC项目:创建过程详见:SpringMVC简单示例——SSM框架
第二步:按照前面介绍内容,完成web.xml和springmvc.xml的配置,这部分内容基本是固定的。
第三步:后端控制器将数据交给前端页面展示及页面跳转控制,即后端控制器(controller)方法返回值的问题,controller可以返回ModelAndView、Model、Map、View、String和void等。在这里我们详细说明ModelAndView、String和void的用法。
返回ModelAndView:在方法内定义ModelAndView对象,并在该对象内指定view和model(数据),返回此ModelAndView对象。代码如下:

@Controller
@RequestMapping(value="/hello")
public class FirstController{
    @RequestMapping("list")
    public ModelAndView getList(){
        ModelAndView mv = new ModelAndView();
        //使用静态数据代替数据库中数据
        List products = new ArrayList<>();
        ProductVO product = new ProductVO();
        product.setId(1);
        product.setProduceName("联想笔记本");
        product.setProduceDesc("thinkpad T 系列");
        products.add(product);

        ProductVO product2 = new ProductVO();
        product2.setId(2);
        product2.setProduceName("Dell笔记本");
        product2.setProduceDesc("移动工作站  系列");
        products.add(product2);

        mv.addObject("datas",products);
        mv.setViewName("WEB-INF/pages/ListPage");

        return mv;
    }
 }

对应在ListPage.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="C" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


    列表页面


   
查询条件
商品列表
序号 商品名称 商品描述
${item.id} ${item.produceName} ${item.produceDesc} 修改

项目启动后,在地址栏输入:http://localhost:8080/SpringMVCDemo2_war_exploded/hello/list,运行结果如下:

返回String:此种方式可跳转视图,但不能携带数据,数据通过方法的形参Model将数据带入视图页面。返回String时有三种情况,分别为返回逻辑视图、重定向(redirect)和转发(forward)。

  • 返回逻辑视图:即跳转到逻辑视图代表的页面。示例中的逻辑视图指JSP文件,根据视图解析器的配置,去掉前缀和后缀的字符串,由于string没有携带数据,数据可以由形参Model返回给前端视图,代码如下:
@RequestMapping("/hello")
public class FirstController{
    //返回逻辑视图
    @RequestMapping("/list2")
    public String dataList(Model model){

        List products = new ArrayList<>();

        ProductVO product = new ProductVO();
        product.setId(1);
        product.setProduceName("联想笔记本");
        product.setProduceDesc("thinkpad T 系列");
        products.add(product);

        ProductVO product2 = new ProductVO();
        product2.setId(2);
        product2.setProduceName("Dell笔记本");
        product2.setProduceDesc("移动工作站  系列");
        products.add(product2);

        model.addAttribute("datas",products);

        return "WEB-INF/pages/ListPage";//jsp名称
    }
  }

jsp页面代码不变。项目启动后,在地址栏输入:http://localhost:8080/SpringMVCDemo2_war_exploded/hello/list2,运行结果同上。

2 重定向(redirect)和转发(forward):使用关键字redirect,将页面重定向到另外一个页面。示例如下:在产品列表页面点击修改时,调用使用URL:product/edit调用dataEdit方法,代码如下。

   
       
序号 商品名称 商品描述
${item.id} ${item.produceName} ${item.produceDesc} 修改

controller方法如下:

@Controller
@RequestMapping("/product")
public class ProductController {
    //返回逻辑视图
    @RequestMapping("/list")
    public String dataList(Model model){

        List products = new ArrayList<>();

        ProductVO product = new ProductVO();
        product.setId(1);
        product.setProduceName("联想笔记本");
        product.setProduceDesc("thinkpad T 系列");
        products.add(product);

        ProductVO product2 = new ProductVO();
        product2.setId(2);
        product2.setProduceName("Dell笔记本");
        product2.setProduceDesc("移动工作站  系列");
        products.add(product2);

        model.addAttribute("datas",products);

        return "WEB-INF/pages/ListPage";//jsp名称
    }
    
    //视图重定向
    @RequestMapping("edit")
    public String dataEdit(String id){
        Boolean ifLogin = true;

        //todo   完成判断是否登录
        if(ifLogin){
            return "forward:modfy";
        }
        else{
            //这里使用的是controller中的方法,而不是jsp视图文件
            return "redirect:/login/login";
        }
    }
    
    @RequestMapping("modfy")
    public String dataModfy(HttpServletRequest request,Model model){

        String id= request.getParameter("id");

        System.out.println(id);
        model.addAttribute("id",id);
        return "WEB-INF/pages/ProductEdit";
    }
 }

需要判断用户是否登录,如果没有登陆,将页面重新定向登录验证身份,如果登陆,则通过转发调出编辑窗口。验证是否登录过程省略,使用一个boolean做简单判断。为了验证增加一个登陆页面Login.jsp,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>



    
    登录


登录



另外还需新增一个登录controller,代码如下:

@Controller
@RequestMapping("/login")
public class LoginCtroller {
    @RequestMapping("login")
    public String Login(){
        return "WEB-INF/pages/Login";
    }
}

URL地址:http://localhost:8080/SpringMVCDemo2_war_exploded/实在看不下去了,将SpringMVCDemo2_war_exploded改成webapp,具体改法参照:IDEA创建MAVEN WEB项目图解
开始做验证测试,在地址栏输入:http://localhost:8080/webapp/product/list,打开页面如图

点击修改,此时ifLogin ==true,转发进入编辑页面,URL地址栏不发生变化,将request携带的参数转发给编辑页面“序号=1”。

将ifLogin修改为false,此时进入重定向登录页面,原来修改的地址栏变化为login。界面如下:

返回void方式:与传统的Servlet使用相同,在异步请求中只返回数据,而不会跳转视图。

小结

以上介绍了前端与后端数据交互中的后端数据如何传送到前端,以及服务器端页面跳转问题。前端数据如何传送到后端,下一节“参数绑定——springMVC入门介绍(二)”做详细介绍。另外前后端分离项目中服务器端页面跳转将转移到前端控制跳转,controller仅提供相应业务操作及数据,此部分内容需要学习完restful风格编程后再展开。

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

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

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