核心类和注解——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文件中,其配置内容如下:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <!-- 加载配置文件,该配置可以省略,缺省时应用程序默认到web-inf目录下找servletName-servlet.xml文件,其中servletName为SpringMVCDemo,与servlet同名-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--标记容器启动时是否加载这个servlet,0或大于0表示启动加载,负数或没有指定
   时延迟加载-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
     <!--配置那些请求(URL)由前端控制器处理这个叫springmvc的servlet处理-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

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

<!--处理映射器配置-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <!--处理适配器配置-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>  

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

<mvc:annotation-driven></mvc:annotation-driven>

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

<bean id="viewResolver" class=
            "org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 设置前缀 -->
        <property name="prefix" value="/" />
        <!-- 设置后缀 -->
        <property name="suffix" value=".jsp" />
</bean>

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

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    <!--声明组件扫描器-->
    <context:component-scan base-package="com.bjwl.controller"/>
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class=
            "org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 设置前缀 -->
        <property name="prefix" value="/" />
        <!-- 设置后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

在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{
    /*多个参数,value不能省略*/
    /*params中的参数必须在请求中携带,如:请求中的参数必须包含username和pwd,且username不能是李四*/
    @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<ProductVO> 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" %>
<html>
<head>
    <title>列表页面</title>
</head>
<body>
   <form action="${pageContext.request.contextPath}/product/list" method="post">
       查询条件
       <table>
           <tr>
               <td>
                   <input type="submit" value="查询"/>
               </td>
           </tr>
       </table>
   商品列表
   <table border="1">
       <tr>
           <td>序号</td>
           <td>商品名称</td>
           <td>商品描述</td>
       </tr>
   <C:forEach items="${datas}" var="item">
       <tr>
           <td><span>${item.id}</span></td>
           <td><span>${item.produceName}</span></td>
           <td><span>${item.produceDesc}</span></td>
           <td><a href="${pageContext.request.contextPath}/product/modfy?id=${item.id}">修改</a></td>
       </tr>
   </C:forEach>
       </tr>
   </table>
   </form>
</body>
</html>

项目启动后,在地址栏输入: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<ProductVO> 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方法,代码如下。

   <table border="1">
       <tr>
           <td>序号</td>
           <td>商品名称</td>
           <td>商品描述</td>
       </tr>
   <C:forEach items="${datas}" var="item">
       <tr>
           <td><span>${item.id}</span></td>
           <td><span>${item.produceName}</span></td>
           <td><span>${item.produceDesc}</span></td>
           <td><a href="${pageContext.request.contextPath}/product/edit?id=${item.id}">修改</a></td>
       </tr>
   </C:forEach>
   </table>

controller方法如下:

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

        List<ProductVO> 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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>登录</title>
</head>
<body>
<h1>登录</h1>
<form action="${pageContext.request.contextPath}/product/list" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="psw"><br>
    <input type="submit" value="提交">
</form>
</body>

另外还需新增一个登录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风格编程后再展开。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring MVCSpring框架的一个模块,提供了基于MVC(Model-View-Controller)架构的Web应用程序开发支持。以下是Spring MVC中的一些核心注解: 1. @Controller @Controller注解用于指示一个Spring MVC控制器,它可以处理HTTP请求,并将处理结果返回给客户端。@Controller注解通常与@RequestMapping注解一起使用,用于指定控制器的请求映射路径。 2. @RequestMapping @RequestMapping注解用于将HTTP请求映射到控制器的处理方法上。它可以用于和方法级别,用于指定请求路径、HTTP请求方法、请求参数、请求头等。 3. @RequestParam @RequestParam注解用于将HTTP请求参数绑定到控制器处理方法的参数上。它可以指定参数名称、是否必需、默认值等。 4. @ResponseBody @ResponseBody注解用于将方法返回值转换为HTTP响应体。它通常用于返回JSON、XML等格式的数据。 5. @PathVariable @PathVariable注解用于将URL路径变量绑定到控制器处理方法的参数上。它可以指定变量名称、是否必需、默认值等。 6. @ModelAttribute @ModelAttribute注解用于将HTTP请求参数绑定到控制器处理方法的模型属性上。它可以指定属性名称、是否必需、默认值等。 7. @SessionAttribute @SessionAttribute注解用于将HTTP Session中的属性绑定到控制器处理方法的参数上。它可以指定属性名称、是否必需、默认值等。 以上是Spring MVC中的一些核心注解,它们可以帮助开发人员快速开发高效、可维护的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值