vscode 搭建SSM项目环境
简介
- 这是一个简单的SSM(Spring+SpringMVC+Mybatis)的Demo
- 本项目使用的是vscode进行编写
- 推荐插件
- Tomcat for Java (adashen.vscode-tomcat)
- Java Code Generators (sohibe.java-generate-setters-getters)
- Java Dependency Viewer (vscjava.vscode-java-dependency )
- Java Extension Pack (vscjava.vscode-java-pack )
- Language Support for Java™ by Red Hat (redhat.java )
- Lombok Annotations Support for VS Code
- Maven for Java (vscjava.vscode-maven)
创建Maven项目
- 选择maven-archetype-webapp项目
- 其他创建的选择创建webapp目录
- 需要的依赖及版本
<spring.version>5.2.2.RELEASE</spring.version>
<servlet.version>3.1.0</servlet.version>
<jsp.version>2.3.1</jsp.version>
<jstl.version>1.2</jstl.version>
<mysql.version>8.0.13</mysql.version>
<mybatis.version>3.4.6</mybatis.version>
<mybatis-spring.version>1.3.2</mybatis-spring.version>
<druid.version>1.1.12</druid.version>
<common.version>6.0.0</common.version>
<fastjson.version>1.2.70</fastjson.version>
web.xml配置
- SpringMVC核心拦截器配置
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 配置文件 -->
<param-name>contextConfigLocation</param-name>
<!-- 默认为 /WEN-INF/XXX-servlet.xml (XXX 为 配置的servlet-name) -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在tomcat服务器启动的时候就就加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<!--
/*和/ 都是拦截所有请求
其中/* 还会拦截到*.jsp
/ 不会拦截到*.jsp 会拦截.html
原因查看 servlet匹配
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 为了能够在tomcat启动的时候可以自动加载Spring的配置文件加上一个监听器
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件位置 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 解决中文乱码问题,加上SpringMVC提供的关于编码的过滤器
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<!-- 对所有的请求的路径进行拦截 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
springmvc.xml配置
- 开启注解驱动,能使用springmvc提供的注解, 使用fastjson来转换@ResponseBody的内容
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 使用fastjson -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- 在web.xml配置了"/" 这个会对静态资源进行拦截,但在SpringMVC的HandlerMapping里面是没有静态资源处理的,所以会报404错误,这时候应该将静态资源交给其他默认的WEB 应用服务器默认的 Servlet 处理
<mvc:default-servlet-handler></mvc:default-servlet-handler>
- 扫描controller所在的包 ,
<context:component-scan base-package="com.antrain.ssm.controller" />
- 配置jsp视图解析器, 在SpringMVC默认返回的是ModelAndView
在返回字符串的时候会认为是视图名,SpringMVC也提供了简化,会对拿到的视图名进行拼接
prefix+视图名+suffix
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
applicationContext.xml配置
-
SpringMVC的核心Servlet启动时会创建一个IOC容器,但在项目经常需要多个IOC容器,在多个 Spring IOC 容器之间可以设置为父子关系,以实现良好的解耦。
-
在 Spring MVC配置文件(
springmvc.xml
)中引用业务层的 Bean,即扫描controller
所在的包 ,配置SpringMVC相关的配置 -
在使用
ContextLoaderListener
时也会创建一个IOC容器, 读取自己的配置文件applicationContext.xml
里面一般配置配置数据源, 整合其他框架, 事务 以及把dao层和service层加入到改容器中 -
在使用Mysql8连接的时候,注意时区问题
serverTimezone=Asia/Shanghai
-
对于Mybatis 混合使用注解和配置
<context:component-scan base-package="com.antrain.ssm.service"></context:component-scan>
<!-- 配置连接池 -->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai">></property>
<property name="username" value="root"></property>
<property name="password" value="654321"></property>
<property name="minIdle" value="8"></property>
<property name="maxActive" value="20"></property>
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="datasource"></property>
<!-- 扫描e实体类包 使用别名 -->
<property name="typeAliasesPackage" value="com.antrain.ssm.pojo"></property>
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<!-- mapper的代理 放到springioc容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描mapper接口包 -->
<property name="basePackage" value="com.antrain.ssm.mapper"></property>
</bean>
- Spring MVC WEB 层容器可作为 “业务层” Spring 容器的子容器:即 WEB 层容器可以引用业务层容器的 Bean,
- 而业务层容器却访问不到 WEB 层容器的 Bean
vscode进行调试
-
安装
Tomcat for Java
后 下载后tomcat 加入vscode中
-
同时
Tomcat for Java
也提供了许多支持,比如我把端口号修改为 8089
- 将项目进行打包,
ctrl+shift+p
输入maven
后选择Maven: Execute commands,
再选择package
执行打包命令后
项目新增了target
找到war包右击选择Run on Tomcat Server
直接在tomcat中执行
- 选择
Open in Browser
后快速选择项目
servlet匹配
-
servlet中的
url-pattern
写法- 以”/’开头和以”/*”结尾的是用来做路径映射的。
- 以前缀”*.”开头的是用来做扩展映射的。
- “/” 是用来定义default servlet映射的。
- 精确写法
-
servlet匹配优先级如下
- 精确路径匹配
- 最长路径匹配
- 扩展匹配
default servlet
: web.xml中如果某个Servlet的映射路径仅仅为一个正斜杠(/),则这个Servlet就成为当前Web应用程序的缺省Servlet。
-
项目的web.xml都继承于tomcat的
conf/web.xml
其中包含的配置
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<!-- 默认session会话保存30min -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 对有
.jsp
应该交给tomcat来处理 - 注意: Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter
@Autowire和@Resource
-
@Autowire
- @Autowired是由Spring提供
- @Autowire默认按照类型(by-type)装配,默认情况下要求依赖对象必须存在。
- 如果允许依赖对象为null,需设置required属性为false
- 如果使用按照名称(by-name)装配,需结合@Qualifier注解使用
-
@Resource
- @Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
- @Resource默认按照名称(by-name)装配,名称可以通过name属性指定。
- 当按照名称(by-name)装配未匹配时,按照类型(by-type)装配。(当显示指定name属性后 则无效)
-
@Resource装配顺序
- 如果同时指定name和type属性,则找到唯一匹配的bean装配,未找到则抛异常;
- 如果指定name属性,则按照名称(by-name)装配,未找到则抛异常;
- 如果指定type属性,则按照类型(by-type)装配,未找到或者找到多个则抛异常;
- 既未指定name属性,又未指定type属性,则按照名称(by-name)装配;如果未找到,则按照类型(by-type)装配。
-
推荐使用
@Resource
, 复习JDK规范
题外话
- 感觉现在vscode做的挺好,插件市场也非常丰富,在插件的帮助下功能也挺完善的,操作也方便,占内存也不大
- 偶尔还是能遇到一些bug
- markdown中的图片是使用是路过图床
- 把外链地址直接复制到csdn 可能会遇到 转存失败 单独把图片地址粘贴几次可以解决问题