springmvc中servlet-mapping标签的使用问题

最近在学习springmvc时遇到了很奇怪的问题,当我在web.xml标签中使用servlet-mapping对相关jsp页面进行映射时,如果我启动tomcat服务器访问该页面,浏览器上将展示源代码,而相同的代码下,同学运行则没有问题。
目前查到的解决方法都没用,第一种是web.xml文件删前面几行配置,第二种是使用注解webservlet注解(springmvc中没发现能用的地方),第三种是tomcat配置的网址访问,试了也没用。
具体代码如下:

<web-app>
  <display-name>chapter14</display-name>
  <servlet>
<!--    配置springmvc前端控制器-->
    <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-config.xml</param-value>
    </init-param>
<!--    配置服务器启动后立即加载的springmvc配置文件-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

spring配置文件

    <context:component-scan base-package="com.niit"/>
    <mvc:annotation-driven/>
    <mvc:resources mapping="/js/**" location="/js/"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

jsp文件,两个方法代码就不截了

<body>
<%--服务器使用name--%>
<form>
    用户号:<input type="text" name="username" id="username"><br>
    密 码:<input type="text" name="passward" id="password"><br>
    <input type="submit" value="测试json交互" onclick="testJson()"><br>
    用户编号:<input type="text" name="number" id="number"><br>
</form>
<button onclick="search()">提交</button>
</body>

运行后访问页面

img

想问下解决方法

jsp文件不能直接点idea里面的那个浏览器预览,它需要部署到tomcat容器中,启动tomcat访问页面。

你直接打开的是文件,并不是部署在tomcat 服务中的页面地址。
浏览器访问的地址都是磁盘目录下的位置,要访问tomcat 服务的方式去打开页面,如:localhost:8080/index.jsp

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7548131
  • 你也可以参考下这篇文章:Springmvc项目web.xml中servlet-mapping的路径映射配置注意事项
  • 除此之外, 这篇博客: Java web开发注解 (从servlet到spring)中的 用户自定义类型注入 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • @Repository
    public class UserDAOImpl implements UserDAO {
        @Overeide
        public void save() {
            System.out.println("UserDAOImpl.save");
        }
    }
    
    • 基于类型注入@Autowired: 用户自定义类型的注入**( 基于类型进行注入 与目标成员变量类型相同或者是子类,实现类)**

      // 基于配置文件的类型注入
      <bean id="userDAO" class="indi.yuluo.dao.UserDAOImpl"/>
          
      <bean id="userService" class="indi.yuluo.service.UserServiceImpl">
      	<property name="userDAO" ref="userDAO"/>
      </bean>
          
      // java程序注入
      @Service    
      public class UserServiceImpl implements UserService {
          
          private UserDAO userDAO;
          
          public void geUserDAO() {
              return userDAO;
          }
          
          @Autowired
          public void setUserDAO() {
              System.out.println("UserServiceImpl.setUserDAO");
              this.userDAO = usrDAO;
          }
          
      }  
      
    • **(了解即可)**基于名字的注入:注入对象的id值,必须与@Qualifier注解中设置的名字相同

      • @Autowired@Qualifier注解共同使用

        @Service    
        public class UserServiceImpl implements UserService {
            
            private UserDAO userDAO;
            
            public void geUserDAO() {
                return userDAO;
            }
            
            @Autowired
            @Qualifier("userDAOImpl")
            public void setUserDAO() {
                System.out.println("UserServiceImpl.setUserDAO");
                this.userDAO = usrDAO;
            }
            
        }
        
    • @Autowired注解的放置位置

      • 放置在对应成员变量的set方法之上

      • 放置在成员变量上**(通过反射完成)**

        @Service    
        public class UserServiceImpl implements UserService {
         
            @Autowired
            private UserDAO userDAO;
            
        }
        
    • JavaEE规范中类似功能的注解

      • JSR250 @Resource: 基于名字进行注入

        @Service    
        public class UserServiceImpl implements UserService {
         
            @Resource(name="userDAOImpl")
            private UserDAO userDAO;
            
        }
        
      • 如果在应用@Resource注解的时候,名字没有配对成功,那么他会继续安装类型进行注入

      • JSR330 @Inject 作用与@Autowired注解作用完全相同,基于类型进行注入 —> 在EJB3.0中常用

用tomcat 允许

img


你这操作不就是想打开文件嘛,用那个打开跟你用记事本打开几乎是一回事儿;
网页你得先部署再请求容器打开

JSP + Servlet的web应用,需要放到web容器里面才能够运行,不能够直接浏览器打开页面访问,常见的web容器有:Tomcat、Nginx、jboss等,一般开发时候,在IDEA中使用Tomcat进行部署运行。

从你的描述和代码中,我理解您的问题是:在web.xml中配置jsp页面映射后,自己运行可以正常访问,而同学运行时会显示jsp源代码。
这是一个比较奇怪的问题,可能的原因有:

  1. 同学的Tomcat服务器路径或端口设置错误。如果Tomcat服务器路径或端口设置不正确,无法正常解析jsp,会显示源代码。您可以检查Tomcat的server.xml文件,确认无错误。
  2. 同学的IDEA运行配置错误。如果IDEA的Tomcat运行配置路径或端口与真实Tomcat设置不符,也会导致此问题。确认IDEA中Tomcat的运行配置设置是否正确。
  3. 您和同学使用的Tomcat版本不同。不同Tomcat版本的jsp解析机制可能不同,可能会导致显示源代码的问题。确认您和同学使用的Tomcat版本是否一致。
  4. 您和同学的JDK版本不同。JSP需要JDK支持,不同JDK版本的JSP解析也可能不同,可能导致显示源代码。确认您和同学的JDK版本是否一致。
  5. 同学的工作空间配置了额外的web项目,与您的项目依赖冲突。如果同学的工作空间存在其他web项目,依赖 Conflict 可能会影响您项目的正常运行。可让同学暂时移除其他web项目测试。
    解决方法:
  6. 检查Tomcat的server.xml配置,确认无错误。如有需要,可让同学重启Tomcat。
  7. 检查IDEA中Tomcat的运行配置,保证与真实Tomcat设置一致。如有需要,让同学重启IDEA。
  8. 更新Tomcat版本至一致版本,或您提供的war包至同学使用一致Tomcat版本。
  9. 更新JDK版本至一致版本。
  10. 让同学暂时移除工作空间的其他web项目,isolated 测试您的项目。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的信息,您在web.xml中配置了Spring MVC前端控制器的servlet,并将其映射到了根路径/,但是在访问JSP页面时,浏览器却显示了JSP源代码。

这可能是因为Tomcat服务器没有正确配置JSP引擎。请检查您的Tomcat是否正确配置了JSP引擎,可以查看Tomcat的日志文件,以确定是否有任何有关JSP引擎的错误信息。

另外,您也可以尝试在web.xml文件中添加以下配置,以确保Tomcat正确地处理JSP文件:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <page-encoding>UTF-8</page-encoding>
  </jsp-property-group>
</jsp-config>

这样可以确保Tomcat正确地解析JSP文件并将其编译为Java Servlet,从而正确地显示JSP页面。

如果上述解决方法仍然无法解决问题,您也可以尝试将JSP页面移动到WEB-INF目录下,以确保JSP页面不能被直接访问。您可以在您的viewResolver bean中配置JSP页面的位置,例如:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

这样可以确保JSP页面只能通过Spring MVC控制器进行访问,而不能直接通过浏览器访问。

最后,建议您检查您的开发环境是否与您的同学的环境相同,包括Tomcat版本、JDK版本、操作系统等,以确保您的代码在不同的环境中都能够正常运行。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

该回答引用ChatGPT
根据问题描述,问题可能出在web.xml的servlet-mapping标签上,建议检查以下几点:

1. 检查url-pattern的配置是否正确,可能是因为url-pattern的配置导致页面无法正常访问。比较好的做法是在url-pattern中加上*.do或*.action的后缀,可以提高请求的可读性,例如:


<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


2. 检查web.xml文件是否有编码问题,如UTF-8编码格式。可以在web.xml文件头部添加以下代码:


<?xml version="1.0" encoding="UTF-8"?>


3. 检查servlet-mapping标签和下面的bean标签中是否配置了正确的jsp文件路径,例如:


<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>


如果以上方法都不行,建议多逐一排查,或者调试环境和同学一致看下是否能正常访问。