springmvc

创建maven-web工程:

 引入基础pom依赖:

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring-version>5.0.16.RELEASE</spring-version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring-version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring-version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
    </dependency>
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>

创建spring.xml文件,和springIoc的配置文件头相同

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

在web.xml中添加映射配置:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <-- 设置主配置文件xml的位置,如果住配置文件名为 ‘项目名—servlet.xml,则不需要进行配置,’-->>
    <init-param>
      <param-name>ContextConfigLocation</param-name>
      <param-value>classpath:springMvc-servlet.xml</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

在主配置文件里添加映射bean:

  <!--处理器映射器,将处理器的name作为url进行查找-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器,配置对处理器中的handleRequest()方法的调用-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器,指定使用的事jstl类型,suffix后缀名,表示视图文件以.jstl结尾,如果是jsp则是.jsp,prifix前缀,视图存储的位置-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="suffix" value=".jsp"></property>
        <property name="prefix" value="/model/"></property>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    </bean>
<!--指明客户端访问student路径时,应该调用哪个接口类-->
<bean id="/student" class="com.zzz.controller.StudentController"/>

创建控制类:

package com.zzz.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*实现controller接口,一个类里只有一个方法,不要引错jar包*/
public class StudentController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
       /* 在modelandView里添加key velue值,*/
        modelAndView.addObject("msg","success");
       /* 告诉视图解析器去找module/test.jsp文件。xml主文件view中设置的前缀和后缀*/
        modelAndView.setViewName("test");
        return modelAndView;
    }
}

在webapp目录下创建module/test.jsp文件:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/5/9
  Time: 17:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

这是入门级别的springmvc,主要实现整体的流程,但是很少用,一般我们都使用注解开发就行了。

将配置文件中的内容删掉,只留一个视图解析器,并开启 context:component-scan包扫描器,再引入mvc驱动:

<!--开启注解扫描-->
    <context:component-scan base-package="com.zzz.controller"></context:component-scan>
    <!--加载mvc驱动,取消上面的bean-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="suffix" value=".jsp"></property>
        <property name="prefix" value="/module/"></property>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    </bean>

在控制层重新写个类,这个类不用实现controller接口,可以直接在类名上面加上controller注解,因为在xml文件中已经开启了controller包的注解扫描,并且只需要在类名上加上@Request注解,即可让mvc驱动找到这个名字,如果是加在类里面的方法上,相当于加一个子名,和之前的一个类只能有一个方法不一样,这里可以有很多个方法,相当于一个班级里有很多学生。

package com.zzz.controller;

import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


@Controller/*不能使用component注解代替,*/
@RequestMapping("/user")/*相当于起一个班级名,下面方法上的注解相当于每个学生的名字 1班某某某。*/
public class UserController {
    /**
     * 通过modelAndView返回给view数据,
     */
    @RequestMapping("/test1")
    public ModelAndView test1(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","success");
        modelAndView.setViewName("test");
        return modelAndView;
    }

    /**
     * 通过model传参,并且设置String返回值类型,可以直接返回jsp文件的名字,
     * @param model
     * @return
     */
    @RequestMapping("/test2")
    public String test2(Model model){
        model.addAttribute("msg","success");
        return "test";
    }

    /**
     * 通过原始类型传参,和第二种类似。
     * @param httpRequest
     * @param httpSession
     * @return
     */
    @RequestMapping("/test3")
    public String test3(HttpServletRequest httpRequest, HttpSession httpSession){
        httpRequest.setAttribute("msg","request");
        httpSession.setAttribute("msg","session");
        return "test";
    }

}

这是返回普通的返回参数,还可以通过ajax返回json数据,需要引入json的jar包:

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.11.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.11.4</version>
    </dependency>

在userController里面新增一个方法test4:

  /**
     * 返回json数据,不管return什么数据,都会自动转成json数据,需要引入json相关依赖,
     * @return
     */
    @RequestMapping(value = "/test4")
    @ResponseBody
    public Map test4(){
        Map map = new HashMap();
        map.put("msg","json");
        return map;
    }

转发和重定向:

比如当我们进行新增业务的时候,如果完成以后直接跳转到查询页面,这时候页面是看不见新增的数据的,所以我们需要进行异步跳转,使用转发或者重定向:

 /**
     * 异步转发:
     * @return
     */
    @RequestMapping("/insert1")
    public String insert1(Model model){
        model.addAttribute("aaaa","bbbb");
        return "forward:/user/test1";
    }

我在这个方法里完成业务以后先转发到我的另一个方法,然后由另一个方法向前端进行反馈,相当于我新增完成后,转发到查询的控制层,然后查询的控制层再讲数据返回给前端页面。这叫异步。

重定向:

@GetMapping("/insert2")
    public String insert2(Model model){
        System.out.println("新增");
        return "redirect:/user/test1";
    }

以上是给前端页面传参,那么同样也可以从前端页面接收参数:

在module文件夹下新建jsp文件,并写入form表单,向控制类发送数据。

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/5/9
  Time: 19:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--提交的时候一定要加上项目名称,tomcat在浏览器运行后的地址--%>
    <form action="/springMvc_war/user/login" method="post">
        id: <input type="text" name="id"><br>
        name: <input type="text" name="name"><br>
        sex: <input type="text" name="sex"><br>
        age: <input type="text" name="age">
        <input type="submit" value="提交">
    </form>
</body>

在userController类里添加方法:

如果前端传过来的参数和接受的参数名称相同,没有问题,但是如果前端传过来的数据名称和我们的接收参数不一致,就会显示name为null,则需要用到@RuquestParam注解,比如前端传过来的是name,我们的参数写的是StudentName,那么久需要用到下面这种方式,required默认是true,代表设置完以后,前端必须要把数据写为name,不然就会报错,如果定义为false,那就相当于注解失效了。

 @RequestMapping("/login")
    public  String login(Integer id, @RequestParam(value = "name",required = false) String studentName, String sex, Integer age){
        System.out.println("id:"+id+"name:"+studentName+"sex:"+sex+"age:"+age);
        return "test";
    }

运行提交以后会在idea里打印前端传过来的数据。

除了这一种以外,还可以使用Map集合传参、实体类传参、原始对象传参,前端数据不用动,

    @RequestMapping("/login")
    public  String login(Integer id, @RequestParam(value = "name",required = false) String studentName, String sex, Integer age){
        System.out.println("id:"+id+"name:"+studentName+"sex:"+sex+"age:"+age);
        return "test";
    }
    @RequestMapping("/login2")
    public String login2(@RequestParam Map map){
        System.out.println(map);
        return "test";
    }
    @RequestMapping("/login3")
    public String login3(StudentTb student){
        System.out.println(student);
        return "test";
    }
    @RequestMapping("/login4")
    public String login4(HttpServletRequest httpServletRequest,HttpSession httpSession){
        System.out.println(httpServletRequest.getParameter("studentName"));
        httpSession.setAttribute("msg",httpServletRequest.getParameter("studentName"));
        return "test";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值