2019了,感觉经济越发不好,房价却还在持续高涨,最近公司砍了几个项目,打算让我们几个搞android开发的转到服务器端。由于以前有做过python服务端开发的经验,又有写了4年android的经验,接手服务端代码没什么难度,主要障碍还是对spring全家桶的学习。

框架模型

一、添加maven依赖

<properties>
<spring.version>3.2.10.RELEASE</spring.version>
</properties>

<dependencies>
<!-- SPRING BEGIN -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>

<!-- SPRING END -->


<!-- JAVAX BEGIN -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
<exclusions>
<exclusion>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!-- JAVAX END -->

</dependencies>

二、写jsp文件

web目录下编写*.jsp文件
为了使代码统一,我们可以在web目录下,创建一个modules目录(名字可以随便),专门用于存放jsp文件
hi.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Spring MVC</title>
</head>
<body>
hello spring mvc
</body>
</html>

三、编写控制器

HiController.java

@Controller // 使用Controller注解,将该类设置为控制器
@RequestMapping("/hi") // 添加路由控制,如果类使用RequestMapping("/hi"),那么该类的方法使用RequestMapping("/xxx")将会在hi的路由下
public class HiController {

@RequestMapping("/say") // 添加该方法的访问
public ModelAndView say(HttpServletRequest req, HttpServletResponse resp) {
String params = req.getParameter("p"); // 获取参数
resp.addHeader("header", "header"); // 设置返回的头部信息,状态码等信息
Data data = new Data();
data.setName(params);
data.setUrl("http://www.baidu.com");
// 返回解析后的视图,和绑定的数据
return new ModelAndView("modules/activity/hi.jsp", "data", data);
}
}

这样:http://localhost:8080/hi/say
需要注意的是:
1、绑定的数据必须是java基础数据基结构(包括List、Map、Set等等)
2、或者是Bean数据

bean配置方法:
1、xml配置方式
创建bean配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">

<!--
id\name: 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
init-method: 在 bean 的所有必需的属性被容器设置之后,将回调该属性指定的方法
destroy-method: 当包含该 bean 的容器被销毁时,将回调该属性指定的方法
scope: Scope: Bean 的作用域 http://wiki.jikexueyuan.com/project/spring/bean-scopes.html
-->
<bean id="data2" class="com.lao.Data" init-method="init" destroy-method="destory">
<!--property 属性:相当于修改Data这个对象的中的name这个字段的属性值,也可以使用ref使用其它的数值
详情见:https://blog.csdn.net/qq_21396469/article/details/63684769
注意:map、set等的设置不一样,详情见上面的url介绍-->
<property name="name" value="123"/>
</bean>

</beans>

web.xml添加bean的配置文件路径

2、Bean注解配置方式
使用注解的方式,就不需要进行xml的配置了,但是需要另外的一个@Configuration配合才可以
Config.java

@Configuration
public class Config {

/**
* initMethod: 在 bean 的所有必需的属性被容器设置之后,将回调该属性指定的方法
* destroyMethod:当包含该 bean 的容器被销毁时,将回调该属性指定的方法
* name: 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
* autowire: 是否通过名称或类型通过基于约定的自动装配注入依赖项? 如果选择是的话,将可以使用@Autowired 来自动生成Bean对象
* 关于@Autowired 说明,见:https://www.jianshu.com/p/9062a92fbf9a
* Scope: Bean 的作用域 http://wiki.jikexueyuan.com/project/spring/bean-scopes.html
*/
@Bean(initMethod = "init", destroyMethod = "destroy", name = "beanName" )
@Scope("prototype")
@DependsOn() // 对应depends-on,https://www.cnblogs.com/zhishan/p/3190771.html
@Lazy(false) // 对应lazy-init
GG getGG(){
return new GG();
}
}

GG.java

public class GG {

private String name;
private String url;

/**
* 在 bean 的所有必需的属性被容器设置之后,调用回调方法
* 对应xml配置中的:init-method
* 或者对应:@Bean(initMethod = "init" )
*/
public void init(){

}

/**
* 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。
* 对应xml配置中的:destroy-method
* 或者对应:@Bean(destroyMethod = "destroy")
*/
public void destroy(){

}
....
}

@Autowired说明:
一般在controller里,我们需要调用service,这时候就需要用到注解 @Autowired

@Autowired
private IUserService userService;

@Autowired 这个annotation,它是为了告诉spring,这个对象没有实例化,需要注入一个IUserService的实例,可是问题是,IUserSerivce是一个接口,如果不指定就不知道你想用哪个实现类,Spring会首先看自己的容器里有没有一个叫做userService的对象,如果找不到就在 配置文件 里配置的路径下面寻找IUserService的实现类,找到了就把它的对象拿过来。

@Autowired 顾名思义,就是自动装配,其作用还可以是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

四、创建spring的配置文件

src\main\resource\spring创建dispatcher-servlet.xml文件,当然(spring)这个目录可以改为其它名字

<?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:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" 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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 对 web 包中的所有类进行扫描,以完成 Bean 创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.lao"/>

<!-- 开启注解 -->
<context:annotation-config/>
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven/>
<aop:aspectj-autoproxy />


<!-- 启动 Spring MVC 的注解功能,完成请求和注解 POJO 的映射 -->
<bean id="annotationMethodHandlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!-- 视图解释类,前缀 + 逻辑名 + 后缀 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/> <!--表示使用的是web这个目录-->
<!--<property name="suffix" value=".jsp"/>--> <!--不使用默认后缀,到时候具体在代码中添加文件的后缀便可-->
</bean>

<!-- 静态资源访问 -->
<mvc:default-servlet-handler/>

</beans>

五、配置web.xml

配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- Sping配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--resources目录下的配置-->
<param-value>
<!--classpath:spring/spring-datasource.xml,-->
<!--classpath:spring/spring-daos.xml,-->
<!--classpath:spring/spring-redis.xml,-->
<!--classpath:spring/spring-ehcache.xml,-->
<!--classpath:spring/spring-dubbo.xml,-->
<!--classpath:spring/spring-other.xml-->
<!--classpath:spring/dispatcher-servlet.xml-->
</param-value>
</context-param>

<!-- Spring 容器启动监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

<!--<display-name>dispatcher-servlet</display-name>-->

<!-- Spring view分发器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/dispatcher-servlet.xml <!--设置前端控制器为/src/resources/spring/dispatcher-servlet.xml配置的前端控制器 -->
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--/: 表示要拦截所有的请求,并交由Spring MVC的后台控制器来处理,-->
<url-pattern>/</url-pattern>
</servlet-mapping>


<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>

六、 配置tomcat

将pom.xml的打包方式改为war

<packaging>war</packaging>

1、创建tomcat

2、配置启动包

3、修改路径
添加前缀或不用前缀

4、检查资源文件路径(非常重要)
检查web资源文件路径是否映射正确,如果为红色,表示的是映射失败!!

最终效果