Maven+SpringMVC过程中经历的一些坑

初次使用Maven以及搭建Springmvc项目的过程

一、Eclipse中创建Maven的web项目
1.选择创建工程,选择other,直接搜索Maven选择Maven project,然后下一步选择工作空间地址这里不要勾选Create a simple project(勾选了就没有项目模板可以选择)
查看

2.下一步后进入选择模板的地方,一般我们建立Java项目的话就直接选择quickstart,这里我们建立web项目的话通常选择webapp
这里写图片描述

3.填写Group id、Artifact id,选择Version (默认为0.0.1-SNAPSHOT 快照版本),点击Finish完成创建
这里写图片描述
Group id与Artifact id是Maven为了保证项目唯一性而提出的,他们与Version一起组成一个坐标,这样通过这个坐标先去本地仓库查找包,如果没有再去远程仓库查找下载
坐标由以下三项构成
- Group id:组织名,一般分为多段,通常第一段是域名(如org,com,cn等,其中org为非盈利组织、com为商业组织、cn为中国、edu为教育组织),第二段是公司名(如org.springframework)
- Artifact id:项目名-模块名(如Spring中的spring-aop-4.3.14、spring-web-4.3.14)
- Version:版本号(如Spring中的spring-aop-4.3.14、spring-web-4.3.14
Springramework中的spring-web包在Maven仓库中的坐标就为Group id+Artifact id+Version(其中如果有多段就分别拆分为目录;/org/springframework/spring-aop/4.3.14)

4.创建出来后工程目录并不完整,也存在一些错误
这里写图片描述

  • 首先这里我们发现jsp出现了一个错误,这个错误为
    Description Resource Path Location Type The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path index.jsp
  • 其次我们发现Maven项目中并没有所有Maven项目中约定的目录(src/main/java、src/main/resources、src/test/java)(Maven遵循约定优于配置的约定

方案:错误是因为工程中没有添加Tomcat运行时相关类导致的,而Eclipse中创建时并没有一并创建出目录来,我们解决方法为右击项目,选择Build Path=>Libraries=>Add Library=>Server Runtime=>选择跑项目的服务器(如果没有的话需要先Create a server)
这里写图片描述
完成后选择Order and Export,然后勾选上目录以及刚刚添加进去的包,点击应用即可
这里写图片描述
结果:
这里写图片描述

二、Maven项目中搭建Springmvc框架编写HelloWord
1.配置pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wrr</groupId>
  <artifactId>maven_webapp</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>maven_webapp Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <!-- 公共属性,方便控制,可通过类似于EL表达式一样引用 -->
  <properties>
    <spring.version>4.3.14.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- 搭建Springmvc框架只需要引用spring-web,spring-webmvc两个包即可Maven会自动引用他们的依赖包 -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <!-- Maven中通过类似与EL表达式一样可以引用上方配置公共属性 -->
        <version>${spring.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.1.0</version>
    </dependency>

    <dependency>
       <groupId>javax.servlet.jsp.jstl</groupId>
       <artifactId>jstl-api</artifactId>
       <version>1.2</version>
    </dependency>

    <dependency>  
       <groupId>taglibs</groupId>
       <artifactId>standard</artifactId>
       <version>1.1.2</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>maven_webapp</finalName>
  </build>
</project>

2.配置web.xml,添加Springmvc的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>
  <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <!-- 配置springmvc配置文件的加载位置,如果不配置的话默认加载WEB-INF目录下的
                [servlet-name]-servlet.xml
                这里没配置的话将加载目录下的springDispatcherServlet-servlet.xml
             -->
            <param-name>contextConfigLocation</param-name>
            <!-- 这里需要注意项目中的classpath并不是/src目录下,而是存放编译后的代码的地方,
                通常默认为/classes目录下 
            -->
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!-- 配置DispatcherServlet需要拦截配置,共有 *.[xx], /*, /, /xx/* 几种方式
            这里我们配置为/ 即为拦截所有的资源,后面我们会在springmvc配置文件中单独配置
            静态资源让其不拦截
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.配置springmvc的配置文件(注解形式)

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

    <!-- 开启springmvc的注解 下面就不需要手动注册注解类型的处理器映射器与处理器适配器 -->
    <mvc:annotation-driven/>

    <!-- 扫描注解,配置到需要扫描的包即可 -->
    <context:component-scan base-package="com.wrr.web"></context:component-scan>

    <!-- 设置静态资源路径,这样就不会被前端控制器拦截处理 -->
    <mvc:resources location="/resources/" mapping="/resources/**"></mvc:resources>

    <!-- 注册视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- jsp中会使用到jstl,所以设置为jstlView -->
        <!-- <property name="viewClass"  value="org.springframework.web.servlet.view.JstlView"/>-->

        <!-- 视图路径前缀 -->
        <property name="prefix" value="/resources/jsp/" />

        <!-- 视图后缀 -->  
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

4.编写Controller与jsp页面

@Controller
@RequestMapping("/say")
public class SimpleController {

    @RequestMapping("/hello")
    public String hello(ModelAndView modelAndView,Model model,HttpServletRequest request) {
        String context = " say hello";

        modelAndView.addObject("modelview", "modelview"+context);
        model.addAttribute("model", "model"+context);
        request.setAttribute("request", "request"+context);

        System.out.println(context);
        return "result";
    }
}
<body>
    <p>modelAndView结果:${modelview }</p>
    <p>model结果:${model }</p>
    <p>request结果:${request }</p>
</body>

运行实测
这里写图片描述
项目是跑起来了,但是我们发现EL表达式并没有起作用,检测了一下支持EL的jstl-api、standard这两个包也导入了,但是为什么EL没有用了呢,后来网上查找了一番,是因为Maven的webapp模板有点古老了,然后创建的web版本是2.3的,2.5以下默认jsp页面是不解析EL表达式的

解决方法
1.修改项目的编译版本以及web版本(2.5以上)window=>show view=>Navigator. 在Navigator视图下编辑org.eclipse.jdt.core.prefs、org.eclipse.wst.common.project.facet.core.xml
这里写图片描述
这里写图片描述
2.修改好配置文件之后我们还需要修改web.xml对应版本的约束信息 http://xmlns.jcp.org/xml/ns/javaee/这个地址下可以下载到各个版本的约束。
修改前(我的web.xml是3.0的,这里对应的3.1应该改为3.0)
这里写图片描述
修改后
这里写图片描述

修改之后我们还需要右击项目Maven=>Maven Profile selection 然后选择jdk,点击ok。接着再Maven=>Update project.
然后我们再次部署到tomcat服务器上。运行却发现居然有404错误(仔细检查确认自己没有错误地方)解决方法:选择tomcat服务器,然后选择Clean
这里写图片描述
再次部署即可!

运行结果
这里写图片描述
这里EL表达式有用了,但是通过ModelAndView设置的属性却取不到值!Model和Request的正常!实在是找不出为什么ModelAndView取不到值的问题了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值