初次使用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取不到值的问题了