1.首先创建webmvc工程,并在pom.xml下添加spring相关坐标
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.14</version>
</dependency>
<!--servlet规范坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
</dependency>
2.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>
<!--全局变量-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
<!--classpath指定内路径,也就是从resource开始-->
</context-param>
<!--监听服务启动事件,生命周期跟随服务器,在服务启动时,读取全局变量contextConfigLocation创建spring容器-->
<!--管理Dao层和服务层-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--servlet:springmvc核心类。所有请求(动态和静态)都交给springmvc管理,管理控制层,就不同写webxml-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value><!--通过读取配置文件创建-->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!-- / *:当前所有请求都拦截,/除了拦截动态请求还会拦截静态请求 -->
</servlet-mapping>
</web-app>
3.在controller文件下创建HelloController类
package net.milkytea.springmvc.web.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
//只要进入请求,就会访问该方法,处理请求
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("hello");
return null;
}
}
4.在applicationContext-mvc.xml里,把HelloController配置成bean,使请求进到接口里
<?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">
<!--使bean的name作为请求的路径-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--只要接收到该name就会把请求发送到HelloController里-->
<bean name="/hello" class="net.milkytea.springmvc.web.controller.HelloController"/>
</beans>
运行后在控制台输出hello
基于上面代码,修改applicationContext-mvc.xml文件
<?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">
<!--使bean的name作为请求的路径-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--只要接收到该name就会把请求发送到HelloController里-->
<bean id="helloController" name="/hello" class="net.milkytea.springmvc.web.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello1">helloController</prop>
</props>
</property>
</bean>
</beans>
在网页输入/hello和/hello1都可以访问,结果是在控制台输出hello
1.在applicationContext-mvc.xml中开启扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="net.milkytea"/>
<!--开启mvc注解,开启mvc支持的所有映射-->
<mvc:annotation-driven/><!--包含了上面两种方法,也就是把所有UrlHandlerMapping都加进去-->
</beans>
2.在controller文件下创建HelloController2类
package net.milkytea.springmvc.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//把该类注册到容器中
public class HelloController2 {
@RequestMapping("/hello2")//完成接口分发(分发请求)
public void sayHello2(){
System.out.println("hello2");
}
}
结果将会在控制台输出hello2
Restful风格的API要求请求参数和响应都是json
常见的请求有:
若为/user,表示对User表中的资源进行访问,获取所有记录,为get请求
若为/user/1,表示获取User表中id为1的记录
所以说明,路径表示对资源的操作
1.getAllUser
在controller文件下创建RestController类
package net.milkytea.springmvc.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/rest/user")
public class RestfulController {
//两种方法
//@RequestMapping(method = RequestMethod.GET)
@GetMapping
public void getAllUser(){
System.out.println("getAllUser");
}
}
利用postman进行测试
结果在控制台输出getAllUser
2.getUserById
@GetMapping("/{id:\\d+}")
public void getUserById(@PathVariable String id){//PathVariable将路径中的变量传进去
System.out.println(id);
}
1.addUser
现在pom.xml安装json转化的包
<!--json转化的包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
然后在RestfulController类下创建方法
@PostMapping
public void addUser(@RequestBody User user){//传json格式
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
@PutMapping("/{id:\\d+}")//修改表中第id条记录
public void updateUserById(@PathVariable String id,@RequestBody String user){
}
@DeleteMapping("/{id:\\d+}")//删除表中第id条记录
public void deleteUserById(@PathVariable String id){
}
package net.milkytea.springmvc.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/hello3")
public class HelloController3 {
@RequestMapping("/1")
public String Hello1(@RequestParam(name = "name") String username, ModelMap modelMap){
modelMap.addAttribute("username",username);
return "/WEB-INF/jsp/user.jsp";
}
}
将modelMap数据转发到jsp文件中
@RequestParam():
将前端参数名为“name”的数据传给username
该方法还有两个参数,分别为defaultValue和required
defaultValue指定默认参数值,required请求路劲中是否包含该参数
在applicationContext-mvc.xml中配置视图解析器
<!--视图解析器-->
<!--视图是文件要转发的路径,模板引擎技术,用数据驱动模板-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--对返回的视图作统一处理-->
<property name="prefix" value="/WEB-INF/jsp/"/><!--前缀-->
<property name="suffix" value=".jsp"/><!--后缀-->
</bean>
@RequestMapping("/2")
public ModelAndView Hello2(){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("username","1234");
modelAndView.setViewName("forward:user");//forward转发
return modelAndView;
}
@RequestMapping("/3")
public ModelAndView Hello3(String keyword){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("username","1234");
modelAndView.setViewName("redirect:http://www.baidu.com/s?wd="+keyword);//forward转发
return modelAndView;
}
@ResponseBody//转成json,响应后返回json
@GetMapping
public List<User> getAllUser1(){
List<User> users = new ArrayList<>();
for (int i=0;i<10;i++){
users.add(new User("mt:"+i,"123",10,"dv"));
}
System.out.println("getAllUser");
return users;
}
@RequestBody请求中接收json
@ResponseBody响应后返回json
若该类为控制器,并所有响应返回都为json
则可以合并@Controller和@ResponseBody为@RestController