springMVC实现控制器映射的两种方法

1.控制器继承Controller类

目录结构如下:

springmvc项目调用外部接口的方式 springmvc调用controller_mvc

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()注解完成配置

目录结构如下:

springmvc项目调用外部接口的方式 springmvc调用controller_java_02

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" %>