SSM-Java开发工具链
# Maven
- Define
Maven是Apache开源项目管理工具,对软件项目提供构建与依赖管理
Maven为Java项目提供了统一的构建与管理方式,是业界标准
Maven是基于项目对象模型(pom.xml)来管理软件工程
# Maven工程结构
目录 | 用途 |
---|---|
${basedir} | 根目录,用于保存pom.xml |
${basedir}/src/main/java | Java源代码目录 |
${basedir}/src/main/resources | 资源目录,保存配置文件、静态图片等 |
${basedir}/src/test/java | 测试类的源代码 |
${basedir}/src/test/resources | 测试时需要使用的资源文件 |
${basedir}/target | 项目输出的目录,用于存储jar、war文件 |
${basedir}/target/classes | 字节码(.class)的编译输出目录 |
${basedir}/pom.xml | 项目(Project)对象(Object)模型(Model)文件 第一个是组织名称、组件、名称以及版本号 |
Note:没想到这样在项目代码里面也能够直接配置镜像源,不需要在 本地目录的 maven setting 里面进行配置。新发现,不错
在软件版本管理中,版本号后缀标注具有特定的含义区分:
- Beta(贝塔)版本:表示开放测试版,面向部分用户群体进行功能测试
- Alpha(阿尔法)版本:属于内部测试版,仅供开发团队及指定测试人员使用
- Release版本:为开放的正式稳定版本,经过充分测试后向所有用户发布
本地仓库其实就是中央仓库的一个镜像,是用来帮我们减低网络压力的
# Maven生命周期
命令 | 用途 |
---|---|
mvn archetype:generate | 创建Maven工程结构 |
mvn validate | 验证项目是否正确,所有必要的信息可用 |
mvn compile | 编译源代码 |
mvn test | 执行测试用例 |
mvn verify | 对项目执行验证 |
mvn package | 项目打包 |
mvn install | 安装至本地仓库 |
mvn deploy | 发布至远程仓库 |
# Maven 常用命令
命令 | 输出位置 | 主要用途 | 依赖关系可见范围 |
---|---|---|---|
mvn package | 项目下的 target/ 目录 | 本地验证构建结果 | 仅当前项目 |
mvn install | 本地 Maven 仓库 | 供本地其他项目依赖 | 本地所有项目 |
mvn deploy | 远程 Maven 仓库 | 供团队或远程环境使用 | 所有有权访问仓库的项目 |
# Jetty
# dependency
<!-- Jetty 启用一定要将打包从Jar改为war -->
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<!--嵌入式Jetty的Maven插件-->
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.14.v20181114</version>
<configuration>
<webApp>
<defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
</webApp>
<!--应用启动后加载webapp网页与资源-->
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<httpConnector>
<!--应用端口号,默认8080端口-->
<port>80</port>
</httpConnector>
</configuration>
</plugin>
</plugins>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 动态修改静态文件
修改 webdefault.xml 里面的一个参数,为了能够在服务器启动时修改静态文件,需要把
useFileMappedBuffer --》 false
# 字符编码
<locale-encoding-mapping>
<locale>zh</locale>
<encoding>UTF-8</encoding>
</locale-encoding-mapping>
1
2
3
4
2
3
4
# Http 请求
在HTTP请求中,常见的参数传递方式主要有两种:
- URL参数(适用于GET请求)
- 参数附加在URL路径后,以键值对形式出现,格式为
?key1=value1&key2=value2
- 后端通过
request.param
获取参数值 - 特点:参数长度受限,安全性较低,适用于简单数据传输
- 参数附加在URL路径后,以键值对形式出现,格式为
- 请求体参数(适用于POST请求)
- 参数通过表单数据(Form Data)或JSON等形式传递
- 后端通过
request body
获取数据 - 特点:支持大数据传输,安全性较高,适用于复杂数据交互
# tips
- @RequestMapping-通用绑定
- @GetMapping - 绑定Get请求
- @PostMapping-绑定Post请求
# 常见的几个错误码
- HTTP 400错误通常表明客户端请求中存在数据结构、格式或语义层面的根本性问题,服务器无法正确解析或处理请求
- HTTP 405 Method Not Allowed 状态码是服务器明确表示不支持客户端请求所用的HTTP方法时的标准响应。
# Tomcat - 中文乱码问题
- 对于 Response 响应乱码,需在 Spring 中配置
StringHttpMessageConverter
; - 对于 Get 请求乱码,在
server.xml
中增加URIEncoding
属性(Jetty 服务器无需设置); - 对于 Post 请求乱码,在
web.xml
中配置CharacterEncodingFilter
(Jetty 服务器无需设置)
# 处理前后端的时间格式
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy", timezone = "GMT+8")
@DateTimeFormat(pattern = "dd/MM/yyyy")
private LocalDate asAtDate;
1
2
3
2
3
- @JsonFormat → 控制Response时间格式
- @DateTimeFormat → 处理Request时间格式
# Json解析
<!-- SpringMVC支持的JSON序列化工具包Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 模板引擎
学完了,也实际盘过几个项目,但是就最近几年的经历来说,还真的没有遇到过有关这种技术的项目。
- 这些技术在一些老项目中仍然广泛使用,尤其是在 Java EE 生态中。如果您的工作环境或项目需求涉及这些技术,值得一学。
- 如果计划进入一些重视传统技术的公司(如银行、政府机构等),掌握这些技能可能会增加您的竞争力。如果目标是现代开发,优先级较低。因为现在走的都是前后端分离的架构,深入这种技术价值不大。
# 声明式事务@Transactional
在Spring框架中,@Transactional
注解的默认行为是:当方法成功执行时自动提交事务,当抛出RuntimeException
及其子类异常时自动回滚事务。
通过指定rollbackFor = Exception.class
参数,可以将触发事务回滚的异常类型扩展到所有异常。这一配置虽小,但对系统安全至关重要。
一个场景是:当 writeOrderToFile 抛出 IOException 时,因为它不是 RuntimeException 的子类,Spring 的事务管理器不会回滚事务。(当然我这个场景只是为了说明我们在使用 transaction 这个类的时候,最好自定义一下异常类,best practice!)
/*
@Transactional 当方法执行成功时自动提交,抛出RuntimeException及其子类时自动回滚
利用rollbackFor = Exception.class遇到所有类型异常都会滚
*/
@Transactional(rollbackFor = Exception.class)
/* 【提高效率】:不使用事务,方法注解优先级比类注解高*/
@Transactional(propagation = Propagation.NOT_SUPPORTED , readOnly = true)
public Goods findById(Integer goodsId) {
return goodsMapper.findById(goodsId);
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
不当的事务配置可能导致严重的安全隐患。例如:
- 系统漏洞被恶意利用
- 非法操作(如刷钱等欺诈行为)
- 引发重大的经济损失
完善页面 (opens new window)