创建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";
}