文章目录
  1. 1. SpringMVC架构搭建
    1. 1.1. 下载Java SE最新版并且配置环境变量
    2. 1.2. 框架文件结构
    3. 1.3. 重要文件
      1. 1.3.1. pom.xml
      2. 1.3.2. web.xml
      3. 1.3.3. servlet
      4. 1.3.4. applicationContext.xml
      5. 1.3.5. controller
    4. 1.4. tomcat配置与run
      1. 1.4.1. tomcat是什么?
      2. 1.4.2. 如何用tomcat部署
  2. 2. SpringMVC入门
    1. 2.1. 先热热身吧
    2. 2.2. Interceptor拦截器
  3. 3. 后续学习

引言:上周四朱文浩导师布置任务,让我用springmvc跑个helloworld,我心想那太好了,不就是个helloworld吗。然鹅做的时候我眉头一皱,发现事情并不简单……由此开始了漫漫WEB开发路……


系统环境:Ubuntu 16.04 x86-64 - VMware Workstation

JAVA: Java SE 9.0.1(JAVA SE 1.9)

IDE:IntelliJ IDEA

SpringMVC架构搭建

本文虽图文并茂,但千万不要抛弃文字只看图片哦

2018.1.13注:本文发表时作者什么都不懂,只是随笔,很多地方说得很模糊,但是现在又懒得改了hhh,我觉得就这样吧,可能说详细了入门的人也看不懂。

下载Java SE最新版并且配置环境变量

  • 下载JAVA SE最新版 http://www.oracle.com/technetwork/java/javase/downloads/index.html
    • optional:下载JAVA RE最新版,在下面的配置环境变量的时候需要。
  • 配置环境变量。下面两个方法我也不知道是哪个方法能用了,索性都试试吧。
    • http://blog.csdn.net/davidhuang2012/article/details/70257531
    • https://jingyan.baidu.com/article/e2284b2b61a2efe2e6118d39.html
    • 最后java -version一下,看看有没有配好。
  • 其他配置及springmvc教程:http://wiki.jikexueyuan.com/project/spring/environment-setup.html 如果有其他问题,参考这篇文章。

框架文件结构

  • 新建工程,选择maven,选好SDK,NEXT。
1
2
GroupID是项目组织唯一的标识符。公司ID,一般GroupID就是填com.leafive.test这样子(将域名倒序输入,所以一般是第一无二的,如im.qq.com则可填入com.qq.im)。
ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
  • 请参考如下文件结构搭建好(新建文件的话推荐右键new file):

其中statics存放静态文件,views存放视图文件。

重要文件

参考袁子华学长的工程:https://github.com/yahaa/HelloShu/blob/master/src/main/webapp/WEB-INF/web.xml

pom.xml

这个文件里写了项目依赖,复制过去就行了,填好后spring等依赖就已经开始下载并配置了,要添加依赖的话,一定要在<dependencies>中写好,方便其他人编写代码时一键下载依赖。

<configuration>中的source和target以及<java.varsion>换成你的java sdk版本(9.0.*就是1.9)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<packaging>war</packaging>
<name>maven-springmvc Maven Webapp</name>
<url>http://maven.apache.org</url>


<groupId>GroupId</groupId>
<artifactId>ArtifactId</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--spring相关包-->
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
<scope>test</scope>
</dependency>

<!-- 使用SpringMVC需配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>


<properties>
<java.varsion>9.0.1</java.varsion>
</properties>


<build>
<finalName>HelloWeb</finalName>
<resources>
<!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.9</source>
<target>1.9</target>
</configuration>
</plugin>
</plugins>
</build>


</project>

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
version="3.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<servlet>
<servlet-name>scHelloWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:HelloWeb-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>scHelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/wrong.jsp</location>
</error-page>

</web-app>

其中servlet的param-value跟name-servlet.xml改就行了。

注意了,如果出现一些地方标红,说cannot resolve servlet,说明文件结构没搭对,重新搭一遍。

servlet

文件名与web.xml中的servlet的param-value保持一致,如HelloWeb-servlet.xml。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--启用spring的一些annotation -->
<context:annotation-config/>


<!-- 自动扫描该包,使SpringMVC认为包下用了@Controller注解的类是控制器 -->
<context:component-scan base-package="com.mzz.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!--HandlerMapping 无需配置,springmvc可以默认启动-->

<!--静态资源映射-->
<!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下-->
<mvc:resources mapping="/statics/**" location="/WEB-INF/statics/"/>
<!--本项目把静态资源放在了WEB-INF的views目录下,资源映射如下-->
<mvc:resources mapping="/views/**" location="/WEB-INF/views/"/>
<!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/>

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>


<!-- springmvc文件上传需要配置的节点-->
<!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--<property name="maxUploadSize" value="20971500"/>-->
<!--<property name="defaultEncoding" value="UTF-8"/>-->
<!--<property name="resolveLazily" value="true"/>-->
<!--</bean>-->
<!--<mvc:interceptors>-->
<!--<mvc:interceptor>-->
<!--<mvc:mapping path="/home/"/>-->
<!--<bean class="com.zihua.tools.HomeInterceptor"/>-->
<!--</mvc:interceptor>-->
<!--&lt;!&ndash;<mvc:interceptor>&ndash;&gt;-->
<!--&lt;!&ndash;<mvc:mapping path="/student/**"/>&ndash;&gt;-->
<!--&lt;!&ndash;<bean class="com.zihua.tools.HomeInterceptor"/>&ndash;&gt;-->
<!--&lt;!&ndash;</mvc:interceptor>&ndash;&gt;-->

<!--&lt;!&ndash;<mvc:interceptor>&ndash;&gt;-->
<!--&lt;!&ndash;<mvc:mapping path="/teacher/**"/>&ndash;&gt;-->
<!--&lt;!&ndash;<bean class="com.zihua.tools.HomeInterceptor"/>&ndash;&gt;-->
<!--&lt;!&ndash;</mvc:interceptor>&ndash;&gt;-->
<!--</mvc:interceptors>-->
</beans>

defaultViewResolver中注释掉的一行如果加上的话是默认选择html视图的,这样访问localhost:8080/HelloWeb/hello时,views里面的hello.jsp就不会work

applicationContext.xml

放一些springAOP啊,springJDBC啊的东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">


<!--&lt;!&ndash;配置文件 &ndash;&gt;-->
<!--<context:property-placeholder location="classpath:jdbc.properties"/>-->

<!--&lt;!&ndash;aop &ndash;&gt;-->
<!--<aop:aspectj-autoproxy/>-->

<!--&lt;!&ndash;包扫描 &ndash;&gt;-->
<!--</context:component-scan>-->

<!--&lt;!&ndash;数据源 &ndash;&gt;-->
<!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
<!--<property name="driverClassName" value="${jdbc.driverClassName}"/>-->
<!--<property name="url" value="${jdbc.url}"/>-->
<!--<property name="username" value="${jdbc.username}"/>-->
<!--<property name="password" value="${jdbc.password}"/>-->
<!--</bean>-->

<!--&lt;!&ndash; hibernate session &ndash;&gt;-->
<!--<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">-->
<!--<property name="dataSource" ref="dataSource"/>-->
<!--<property name="hibernateProperties">-->
<!--<props>-->
<!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>-->
<!--<prop key="hibernate.show_sql">true</prop>-->
<!--<prop key="hibernate.format_sql">true</prop>-->
<!--<prop key="hibernate.cache.use_second_level_cache">false</prop>-->
<!--<prop key="hibernate.cache.use_query_cache">false</prop>-->
<!--<prop key="current_session_context_class">thread</prop>-->
<!--<prop key="hibernate.hbm2ddl.auto">update</prop> &lt;!&ndash;自动创建数据表 &ndash;&gt;-->
<!--<prop key="hibernate.current_session_context_class">-->
<!--org.springframework.orm.hibernate5.SpringSessionContext-->
<!--</prop>-->
<!--</props>-->
<!--</property>-->
<!--<property name="packagesToScan">-->
<!--<list>-->
<!--<value>com.mzz.entity</value>-->
<!--</list>-->
<!--</property>-->
<!--</bean>-->
<!--&lt;!&ndash; 事务管理 &ndash;&gt;-->
<!--<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">-->
<!--<property name="sessionFactory" ref="sessionFactory"/>-->
<!--</bean>-->

<!--&lt;!&ndash; 事务 advice &ndash;&gt;-->
<!--<tx:advice id="txAdvice" transaction-manager="transactionManager">-->
<!--<tx:attributes>-->
<!--<tx:method name="get*" read-only="true" propagation="REQUIRED"/>-->
<!--<tx:method name="list*" read-only="true" propagation="REQUIRED"/>-->
<!--<tx:method name="find*" read-only="true" propagation="REQUIRED"/>-->
<!--<tx:method name="get*" read-only="true" propagation="REQUIRED"/>-->
<!--<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>-->
<!--</tx:attributes>-->
<!--</tx:advice>-->
<!--&lt;!&ndash;aop &ndash;&gt;-->
<!--<aop:config proxy-target-class="true">-->
<!--<aop:advisor pointcut="execution(public * com.mzz.service.*Service.*(..))" advice-ref="txAdvice"/>-->
<!--</aop:config>-->

</beans>

controller

由于servlet里面的编写规则,只要标记了@Controller的都会被认为是控制器。

在函数名前加@RequestMapping(value="路径",method=RequestMethod.方式)来添加映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mzz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.ui.ModelMap;
@Controller

public class controller{
@RequestMapping(value="/hello",method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Wrold!");
return "hello";
}
@RequestMapping(value="/",method = RequestMethod.GET)
public String index() {
return "index";
}
}

这个return的字符串是直接作为结果返回的,可以是一个页面的前缀(这样相当于response对应的网页),也可以是一个json、xml格式的字符串,也可以是一个简单的字符串

tomcat配置与run

tomcat是什么?

1
通俗点说它是jsp网站的服务器之一,就像asp网站要用到微软的IIS服务器,php网站用apache服务器一样,因为你的jsp动态网站使用脚本语言等写的,需要有服务器来解释你的语言吧,服务器就是这个功能。如果你的网页是纯html的,浏览器就可以直接解释查看效果,但是你的网页一但是.jsp .asp .php 等的动态网页时浏览器自己就无法解释了,需要上面说到的服务器。tomcat便可以解释jsp等java编写的网站。

如何用tomcat部署

  1. 下载tomcat: Apache Tomcat 并解压

  2. 先点击Configure project structure

  3. 随后:

  1. 然后一路确定。

  2. 右上角,edit configurations

  3. add a tomcat local server configuration

  4. 右边Application server选择我们第一步下载并解压的tomcat文件夹

  5. 配置deployment,添加一个war exploded artifact,第3步是这个项目基于哪个子目录下的,如果写/HelloWeb,则根目录在localhost:8080/HelloWeb

    对了!!Artifact选爆炸(exploded)的那个!!不然就跑不起来了!!

    kastnerorz: exploded代表解压的(unzipped),是将application server指向你的目录,而不是将war包部署到你的server来测试运行。用exploded支持热部署,这样你可以更改jsp文件等而不重启服务。

  6. RUN吧。你可以访问localhost:8080/HelloWeb/hello看看效果。

SpringMVC入门

学习SpringMVC则必须要会Spring和Java Web开发,不能相互分离。

先热热身吧

MVC框架

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

  • 注意!上面的文件架构是正确的(根据袁子华学长的工程迁移而来),但可能与下面教程中的文件架构不相同,请仔细斟酌!不必与下面教程趋同!

    • 极客学院SpringMVC教程 搞好了helloworld,可以照着这个教程搞出点其他的东西,增加兴趣。
    • JavaEE系统结构 咱们搞web开发的还是得弄弄系统体系结构的,这个讲的简单而明确。然后你现在知道Tomcat是什么了吧。
    • HTTP协议我见过的讲HTTP协议的文章中很好的一篇了。简直棒极了!
    • Servlet概述还记得我们上面重要文件中的servlet了吗,看不懂吧?这个文章讲的不是springmvc里面的东西,而是javaweb,但知识大同小异,看看servlet到底是个啥就行了。
    • Servlet接口方法详解从这篇文章我们了解了解HttpServletRequest和HttpServletResponse之类的接口就好了,以后会用到的。

Interceptor拦截器

  • SpringMVC中使用Interceptor拦截器 这个文章讲的非常好了!我选择用HandlerInterceptor实现,因为它里面有我熟悉的喜之郎果冻,啊呸,有我熟悉的HttpServletRequest和HttpServletResponse。
  • Spring JDBC 这个是Spring MVC框架连接数据库的很好的示范,当然,也可以用常规DataSource方法+继承InitializingBean的方法连接。

后续学习

  1. 力推Spring学习书**《Spring 4.x 企业应用开发实战》**。
  2. 力推WEB开发公众号 码农翻身
  3. 力推操作系统 Ubuntu16.04 ,输入法用搜狗,QQ用docker镜像 bestwu/qq
  4. 本文不更了!
文章目录
  1. 1. SpringMVC架构搭建
    1. 1.1. 下载Java SE最新版并且配置环境变量
    2. 1.2. 框架文件结构
    3. 1.3. 重要文件
      1. 1.3.1. pom.xml
      2. 1.3.2. web.xml
      3. 1.3.3. servlet
      4. 1.3.4. applicationContext.xml
      5. 1.3.5. controller
    4. 1.4. tomcat配置与run
      1. 1.4.1. tomcat是什么?
      2. 1.4.2. 如何用tomcat部署
  2. 2. SpringMVC入门
    1. 2.1. 先热热身吧
    2. 2.2. Interceptor拦截器
  3. 3. 后续学习