开发记录:重定向redirect、BeanUtils进行对象拷贝、Maven的module多模块管理
开发记录:重定向redirect、BeanUtils进行对象拷贝、Maven的module多模块管理
控制器方法重定向redirect携带参数回调
在做微信操作登录的开发过程中,需要在控制器方法结束的时候,直接在服务器端进行重定向,跳转到指定页面,同时需要携带参数进行页面渲染,记录一下。
注意,由于要携带name参数,可能name中会有中文,直接把中文放到网址中进行请求是不允许的,所以需要用URLEncoder编码进行encode。
URLEncoder编码:
客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文。
而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址,
将网址中的非ASCII码内容转换成可以传输的字符
//微信操作的接口
@Controller
@RequestMapping("/api/ucenter/wx")
public class WeixinApiController {
.....
String token = JwtHelper.createToken(userInfo.getId(), name);
map.put("token", token);
// 跳转到前端页面
return "redirect:" + ConstantWxPropertiesUtils.YYGH_BASE_URL +
"/weixin/callback?token="+map.get("token")+ "&openid="+map.get("openid")+"&name="
+URLEncoder.encode(map.get("name"),"utf-8");
....
}
使用BeanUtils进行JavaBean中参数的拷贝
用法
// hospitalSetQueryVo转换Hospital对象
Hospital hospital = new Hospital();
// public void copyProperties (Object dest, Object orig)
BeanUtils.copyProperties(hospitalQueryVo, hospital); // 将值进行复制
注意
【强制】避免用 Apache Beanutils 进行属性的 copy。
说明:Apache BeanUtils 性能较差,可以使用其他方案比如 Spring BeanUtils, Cglib BeanCopier,注意均是浅拷贝。
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝
- 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
实际开发中,并不推荐使用Apache Beanutils ,而是使用 Spring BeanUtils 比较好
Maven管理父子module
需要注意的是(个人理解):在项目中,用于管理子module的module往往是父module,需要使用pom的方式打包,即只是管理子项目的版本依赖或继承关系,其src下没有实际执行的业务逻辑代码。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 所有的子module需要在父级pom.xml文件中声明 -->
<modules>
<module>common</module>
<module>model</module>
<module>service</module>
<module>hospital-manage</module>
<module>service_client</module>
<module>service_gateway</module>
</modules>
<!-- 依赖的父级项目,往往springboot项目,最大的父级依赖 spring-boot-starter-parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 关于当前项目的一些信息,包括名称、打包方式,注意父项目用pom方式 -->
<groupId>com.atguigu</groupId>
<artifactId>yygh_parent</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>yygh_parent</name>
<description>yygh_parent</description>
<!-- 依赖版本绑定 -->
<properties>
<java.version>11</java.version>
<cloud.version>Hoxton.RELEASE</cloud.version>
<alibaba.version>2.2.0.RELEASE</alibaba.version>
<mybatis-plus.version>3.3.1</mybatis-plus.version>
<mysql.version>5.1.46</mysql.version>
<swagger.version>2.7.0</swagger.version>
<jwt.version>0.7.0</jwt.version>
<fastjson.version>1.2.29</fastjson.version>
<httpclient.version>4.5.1</httpclient.version>
<easyexcel.version>2.2.0-beta2</easyexcel.version>
<aliyun.version>4.1.1</aliyun.version>
<oss.version>3.9.1</oss.version>
<jodatime.version>2.10.1</jodatime.version>
</properties>
<!--配置dependencyManagement锁定依赖的版本-->
<dependencyManagement>
<dependencies>
<dependency>
.......
Maven packaging:pom、jar、war
转载自百度
项目的打包类型:pom、jar、war
1.pom工程:用在父级工程或聚合工程中。用来做jar包的版本控制。
2.war工程:将会打包成war,发布在服务器上的工程。如网站或服务。
3.jar工程:将会打包成jar用作jar包使用,packaging默认类型。
进一步解释:
-
项目中一般使用Maven进行模块管理,每个模块下对应都有一个pom文件,pom文件中维护了各模块之间的依赖和继承关系。
-
项目模块化可以将通用的部分抽离出来,形成一个独立的module,方便重用,会带来这样的好处,那就是修改一部分代码的时候,不再是build整个项目,而是buildmodule,缩短了build时间。此外各模块都有自己的pom文件,结构更清晰。
-
使用maven进行模块划分管理,一般都会有一个父级项目,pom文件除了GAV(groupId, artifactId, version)是必须要配置的,另一个重要的属性就是packaging打包类型,所有的父级项目的packaging都为pom,packing默认是jar类型,如果不作配置,maven会将该项目打成jar包。作为父级项目,还有一个重要的属性,那就是modules,通过modules标签将项目的所有子项目引用进来,在build父级项目时,会根据子模块的相互依赖关系整理一个build顺序,然后依次build。
-
示例:
<?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"> <!-- 声明这个module的父级 --> <parent> <artifactId>父项目名称</artifactId> <groupId>com.xxxx</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- 当前module的名称 --> <artifactId>service</artifactId> <!-- 使用pom,是因为这个pom.xml只是为了管理module,而没有具体的逻辑代码 --> <packaging>pom</packaging> <!-- 子模块引入 --> <modules> <module>service_user</module> <module>service_hosp</module> <module>service_cmn</module> <module>service_msm</module> <module>service_oss</module> <module>service_task</module> <module>service_order</module> <module>service_statistics</module> </modules> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> ........
-
-
子项目,必须在其对应的 pom.xml 文件中,声明对父级项目的引用,通过GAV实现。对于子项目自己的GAV配置,GV如果不配置,则会从父级项目的配置继承过来。子模块可通过dependencies标签来添加自己的依赖,此外子类项目的packaging值一般是war或者jar,前面已经说过,packaging默认是jar类型。如果是需要部署的项目,则需要打包成war类型,如果只是内部调用或者是作服务使用,则推荐打包成jar类型。
-
子模块的 pom.xml 文件示例:
<?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"> <!-- 声明这个module的父级 --> <parent> <artifactId>service</artifactId> <groupId>com.atguigu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <!-- 当前module的名称 --> <artifactId>service_task</artifactId> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <!-- 引入子module需要的依赖 --> <dependencies> <dependency> <groupId>com.atguigu</groupId> <artifactId>rabbit_util</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
-