Loading

1 2

开发记录:重定向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 比较好

2022-02-24_161735

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>
      
posted @ 2022-02-24 17:19  Komorebi_WH  阅读(135)  评论(0编辑  收藏  举报