springMVC实现控制器映射的两种方法
1.控制器继承Controller类
目录结构如下:
1.[NAME]-servlet.xml中:导入配置,并完成映射器、适配器、视图解析器的bean配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
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
">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- controller执行后跳转目标页面路径前后缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="/test" class="com.xxx.controller.TestController"/>
</beans>
2.web.xml中:配置DispatcherServlet
<?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>testServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:testServlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 加载次序,数字越小越先加载-->
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/</url-pattern>
<!-- 配置Servlet要拦截的路径-->
</servlet-mapping>
</web-app>
3.建立一个继承了Controller类的controller类
package com.xxx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class TestController implements org.springframework.web.servlet.mvc.Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView=new ModelAndView();
String str="test message";
modelAndView.addObject("msg",str);
modelAndView.setViewName("test");//跳转目标页面名
return modelAndView;
}
}
4.在ViewResolver配置的路径下新建一个与ViewName名字相对应的jsp页面,并用${msg}接收modelAndView携带的数据,以看到测试效果
2.用@Controller注解和@RequestMapping()注解完成配置
目录结构如下:
1.在resources目录下新建一个[NAME]-Servlet.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
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
">
<mvc:default-servlet-handler/><!--忽略静态资源-->
<mvc:annotation-driven/><!--注解驱动,将由spring完成对mapping和Adapter的配置-->
<context:component-scan base-package="com.xxx"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="suffix" value=".jsp"/>
<property name="prefix" value="/WEB-INF/jsp"/>
</bean>
</beans>
2.web.xml配置DispatcherServlet
<!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>
<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>
3.创建一个controller类,并加注解
package com.xxx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/test")
public String hello(Model model){
System.out.println("method \"hello\"used");
String str="hello!";
String target="/test";
model.addAttribute("msg",str);
return target;
}
}
4.新建一个与controller测试类返回的target同名的jsp文件,并用${}接收方法传来的变量值
3.可能出现的问题及解决方案
1.跳转到的jsp页面404
解决方案:
1.在project structure中检查lib是否缺失
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmtaLHuc-1653277380720)(C:\Users\13373273827\AppData\Roaming\Typora\typora-user-images\image-20220523113200262.png)]
2.检查路径拼写是否多或少了"/",这一点可在tomcat404报错路径上得到体现
3.排除以上错误,debug检查访问时是否跳转到了Controller,Controller类是否执行,以确定问题存在的具体位置
2.启动服务器过程报错终止,提示:A child container failed during start
1.tomcat与jstl内容冲突
解决方案:排除jstl中的servlet部分
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
2.依赖版本冲突
解决方案:依照下表修改依赖版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAbbCmxq-1653277380722)(C:\Users\13373273827\Pictures\1596251-20190221153714709-1436757221.png)]
3.jsp页面EL表达式不起作用
原因:EL表达式被默认忽略
解决方案:在页面加入如下配置
<%@ isELIgnored="false" %>
</exclusion>
</exclusions>
</dependency>
2.依赖版本冲突
解决方案:依照下表修改依赖版本
[外链图片转存中…(img-nAbbCmxq-1653277380722)]
3.jsp页面EL表达式不起作用
原因:EL表达式被默认忽略
解决方案:在页面加入如下配置
<%@ isELIgnored="false" %>