一起学SpringMVC之一:使用maven起项目

网上看了很多springMVC helloworld的教程,非常不满意;首先,maven构建的就很少,再者,绝大部分都是断章取义,让人不明就里。其中有几篇讲的好的,我摘录了一些,自己试着构建了一下项目,发现里面还是有很多需要注意的地方,就记录在这里吧。
我是一个喜欢刨根问底的人,所以我打算从手动maven搭建项目开始,然后导入IDEA,一直到配置并且运行起Helloworld

1 . 安装maven,并配置环境变量

这个就不说了,网上一搜一大把。使用mvn -v检查maven是否安装
安装完成后建议修改一下仓库为国内,要不然速度就呵呵了,这里推荐一个速度杠杠的国内镜像(阿里云),看见这篇文章你就偷着乐吧,不知道哪天就不能用了

<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>

2 . 使用maven archetype 构建项目脚手架

//随便找个文件夹运行以下命令
mvn archetype:generate -DarchetypeCatalog=internal

mvn archetype:generate根据项目脚手架建立相对应的java项目,运行完这个命令以后将搭建起springMVC项目雏形。
-DarchetypeCatalog=internal这个说一下,还是那句话,谢谢伟大的墙,谢谢方校长,让我们中国程序员获得了这么多黑技能...不加这个的话,你的mvn必然会卡死在Generating project in Interactive mode...这一步,以下是完整解释:

archetype是一个插件名称,generate是一个目标名称.mvn archetype:generate 命令会从远程拉取所有的原型(大约1575个)供你选择,使用-DarchetypeArtifavtId=[archetype]参数可以指定archetype类型。如果卡在Generating project in Interactive mode这一步,是因为maven在从远程拉取信息,使用 -DarchetypeCatalog=internal 参数让它不要从远程服务器上取catalog。 添加这句话之后,就不会卡死了.就会进入交互阶段,一步步询问.每一步如果有默认选项直接按enter即可。

然后根据命令行提示填写groupId,artifactId,version,package。这样在当前目录下就生成了一个项目。
另:附上一键生成项目命令:

mvn archetype:generate -DgroupId=com.mycompany.helloworld -DartifactId=helloworld -Dpackage=com.mycompany.helloworld -Dversion=1.0-SNAPSHOT -DarchetypeCatalog=internal 

不管怎么样,我们最终生成了标准的基于maven的Springmvc项目。其实也可以不用archetype,我们自己建立文件夹遵守maven规定即可:

//建立工程目录
src/main/java/com/monodev/mvcstudy
//建立test目录
src/test/java/com/monodev/mvcstudy
//建立resources文件夹
src/main/resources
//建立webapp目录和配置文件(名字可随意)
src/main/webapp/WEB-INF/web.xml
src/main/webapp/index.jsp

2. 添加pom依赖

打开pom.xml,添加:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>3.2.3.RELEASE</version>
    </dependency>

是的,你没有看错,就一个依赖。
这个地方我也绕了很久,手动加各种依赖,然后各种编译期出错。。。各种头大。最后上了spring官网,发现就这一个依赖就够了。。。

另外,在IDEA中有一个炒鸡好用的maven面板,我们稍后说

3.maven安装依赖

项目根目录运行mvn clean installmaven会自动下载所有依赖并编译项目,完成后会在根目录下生成target文件夹。

4. 是时候导入IDEA了

其实个人觉得idea好用是真的,慢也是真的。。。我打算研究下用sublime3写java,试试行不行,idea太笨重了。什么?为什么不用eclipse?我只能说颜值太差好么?一个一看就像上个世纪的IDE,怎么让人提起使用他的兴趣...

打开idea,import项目,没啥好说的,导入以后要做这几件事:

  1. 右键单击src文件夹,Mark Directory as->Source Root,否则写代码时找不到引用
  2. 右键单击resources文件夹,Mark Directory as->Resource Root
  3. 右键工程设置SDK为你安装的java sdk
  4. 配置tom猫:


    运行配置

    这里选择打开面板,点+号,从左侧列表选择Tomcat server - local

tom

然后选择你的tomcat安装位置,设置如下:

tom

这里没有tomcat server?

File-settings-Plugins,搜索tomcat,并启用:

tom

5. 配置

到了这里,你以为就能开始写controller了?呵呵,太naive,这是java,没那么容易的。
首先,在resources下建立config文件夹,下建立spring-mvc-config.xml文件,也就是mvc的配置文件,它长这个熊样:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--规定组件bean扫描的基础包位置-->
    <context:component-scan base-package="com.monodev.mvc.controller"/>
    <!-- 静态资源(js、image等)的访问 -->
    <mvc:default-servlet-handler/>
    <!--启用注解-->
    <mvc:annotation-driven/>
    <!--ViewResolver 视图解析器-->
    <!--用于支持Servlet、JSP视图解析-->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

继续打开WEB-INF下的web.xml文件,添加以下内容:

<!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 version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>springmvc-app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <!--使用刚才的配置文件,classpath就是resources目录-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:config/spring-mvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup><!--这个不用解释了,数字越小越靠前,DispatcherServlet是SpringMVC的基础,必然是第一个处理的-->
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc-app</servlet-name>
    <url-pattern>/</url-pattern><!--映射根路径-->
  </servlet-mapping>
</web-app>

5. helloworld

终于可以写代码了!
终于可以写代码了!
终于可以写代码了!
终于可以写代码了!
终于可以写代码了!

web开发我用过c#的.net,javascript的express,python的flask,现在写java,我感受最深的就是这句话,配置配到死,基本上,你学会了各种配置方法,就学会了spring

以下是我的其他体会:

1 .Spring的精髓不是IoC,也不是AOP,而是xml

2. 我深深的体会到 spring boot是一项伟大的创举,是java世界里的未来之星,将拯救无数java程序员于水火之中!

src下建包、建文件:

first controller
@Controller 
public class HelloworldController {
    @RequestMapping("/index")
   public  String test(){
       return "index";
   }
}

返回的是index视图名称,所以根据spring-mvc-config.xml中的配置,在webapp下建立views/jsp目录,并建立index.jsp文件:

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

点击运行,idea将把项目deploy到tomcat容器的ROOT文件夹下,浏览器中运行就可以看到helloworld了。

7. 补充

前面提到idea的maven面板。就在右上角,点击Maven Projects打开

maven projects
依赖的库
dependency detail

这个工具可以让我们很好的看到依赖的关系,此处就能看到,虽然我们只引了一个spring-webmvc依赖,但其实一环套一环,有很多。
使用spring boot起的项目,这里的依赖多到惊人
总之,这个面板是一个很强大的依赖管理面板

后记:
写了一段时间java,最大的感觉就是像极了八股文。繁文缛节颇多。这样一个helloworld不管用任何其它语言都是分分钟的事,到java这里就难了。
不过java的开源库也是巨量的,这个又是.net没法比的,其实现在docker的出现,java的“一次编写,处处运行”也就不是什么优势了。以后java这门语言的优势恐怕就仅仅剩下轮子的数量了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,628评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,773评论 6 342
  • Maven编译代码的相关命令 第一、main目录下的主代码编写完毕后,使用Maven进行编译,在项目根目录下运行命...
    加油小杜阅读 1,172评论 0 2
  • 1.编写POM Maven项目的核心文件是pom.xml,POM(Project Objcet Model)项目对...
    zlcook阅读 5,900评论 7 26
  • 毕业之后开始喜欢读书的。此时有了经济基础,少了考试的功利心。纯粹的喜欢。读的也比较杂,散文、小说、励志、育儿、菜谱...
    换个活法007阅读 907评论 0 0