3.1、步骤
-
配置web.xml,注册DisPatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1 数字越小级别越高--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
编写MVC配置文件:springmvc-servlet.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"> </beans>
-
添加处理器映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
添加处理器适配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
添加视图解析器
<!--视图解析器:DispatcherServlet给他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean>
-
编写业务Controller
package com.mosang.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接口 public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); //封装对象,放在ModelAndView中。Model mv.addObject("msg","HelloSpringMVC!"); //封装要跳转的视图,放在ModelAndView中 mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp return mv; } }
-
SpringIOC容器中,注册bean
<!--Handler--> <bean id="/hello" class="com.mosang.controller.HelloController"/>
-
运行测试 hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Hello</title> </head> <body> ${msg} </body> </html>
3.2、报错
可能遇到的问题:访问出现404,排查步骤:
-
查看控制台输出,看一下是不是缺少了什么jar包。
-
如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖!
-
重启Tomcat 即可解决!
3.3、注解开发mvc
-
导入基本依赖
-
配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
新建Spring配置文件springmvc-servlet
<?xml version="1.0" encoding="UTF8"?> <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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描指定包下的注解,由IOC统一管理--> <context:component-scan base-package="com.mosang.controller"/> <!-- 让mvc不处理静态资源 .css .js .html .mp3--> <mvc:default-servlet-handler/> <!-- 支持注解驱动--> <mvc:annotation-driven/> <!-- 视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
- 注意beans的导入包路径
-
创建controller并用注解实现
package com.mosang.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; //使IOC容器初始化时自动检测到 @Controller //可作用于类上,加装一层(一般不用) //@RequestMapping("/annotation") public class HelloController { // 映射请求路径 @RequestMapping("/hello") public String hello(Model model){ //封装数据 model.addAttribute("msg","HelloAnnotation!!"); return "hello";//由视图解析器处理 } }
-
创建视图层
在/WEB-INF/jsp下创建hello.jsp,名称需与映射请求路径一致
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
测试:
3.4、Controller配置
-
控制器负责提供访问应用程序的行为,通常通过接口的定义或注解两种方法来实现
-
控制器负责解析用户的请求并将其转换为一个模型
-
SpringMVC中一个控制器可以有多个方法
-
SpringMVC中,对于Controller的配置有很多种
Controller是一个接口
在 org.springframework.web.servlet.mvc.Controller 包下
接口中只有一个方法
@FunctionalInterface
public interface Controller {
/**
* Process the request and return a ModelAndView object which the DispatcherServlet
* will render. A {@code null} return value is not an error: it indicates that
* this object completed request processing itself and that there is therefore no
* ModelAndView to render.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render, or {@code null} if handled directly
* @throws Exception in case of errors
*/
@Nullable
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
只要实现了Controller接口的类,就是一个控制器
1、实现接口方法
public class controller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","hellocontroller");
mv.setViewName("hello");
return mv;
}
}
需要在配置文件中注册bean,name:请求路径,class:对应处理请求的类
<bean name="/test1" class="com.mosang.controller.controller"/>
若使用实现接口方法,则一个控制器中只有一个方法,若要多个方法,则只能新建多个类
2、注解实现
@Controller
public class controller1 {
@RequestMapping("/test2")
public String test(Model model){
model.addAttribute("msg","controller1");
return "hello"; //封装并跳转的页面名称
}
}
-
@Controller 代表这个类被spring接管,这个类中的所有返回值为String、且有具体的页面可以跳转的方法,会被视图解析器解析
-
Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能够找到定义的控制器,需要在配置文件中声明
<context:component-scan base-package="com.mosang.controller"/>
多个请求可以指向同一个页面,但页面的显示结果是不一样的,取决于传递的参数值
3.5、RequestMapping配置
-
@RequestMapping用于映射url到控制器类或一个特定的处理程序
-
可作用于类上,也可作用于方法上
-
若仅作用在方法上:
@RequestMapping("/test2") public String test(Model model){ model.addAttribute("msg","controller1"); return "hello"; }
请求路径为/test2
-
若同时作用于类和方法上:
@Controller @RequestMapping("/control") public class controller1 { @RequestMapping("/test2") public String test(Model model){ model.addAttribute("msg","controller1"); return "hello"; //封装并跳转的页面名称 } }
请求路径为/control/test2
-
即需要先指定类路径名在指定方法路径名
Tomcat刷新
-
改变java代码:Redeployed 重新发布
-
改变xml配置:Restart 重启Tomcat
-
改变html网页: 刷新