蜗牛互联网

蜗牛互联网 查看完整档案

上海编辑东北林业大学  |  计算机 编辑阿里巴巴  |  技术专家 编辑 huayonglun.com 编辑
编辑

微信搜一搜【蜗牛互联网】关注这个有趣的程序员,关注后回复【1024】有我准备的一线大厂面试资料和简历模板。

个人动态

蜗牛互联网 发布了文章 · 1月21日

两种方式,花五分钟就能构建一个 Spring Boot 应用

前言

Spring Boot 的好处自然不必多说,对于想要从事 Java 工作的朋友们来说,可谓是必学的技能。

在我看来,它的优势就是多快好省

  • 功能多,很多常用的能力都有集成;
  • 接入快,简单的几行代码就能完成接入;
  • 维护好,社区活跃度高,有了问题能够第一时间找到解答;
  • 省钱,免费开源项目自然是个人或者企业的最爱。

接下来详细讲下 Spring Boot 的接入教程,方便刚接触这项技术的读者朋友学习。

相关依赖

技术栈:

  • Java 8
  • Maven 3
  • Spring Boot 2.4.2

环境:

  • 操作系统:MacOS(Windows 也类似)
  • IDE(集成开发环境):IntelliJ IDEA 旗舰版 2020.1 版本

Spring Boot 项目初始化

有两种方式:

  1. 官网打包
  2. IDE 生成

官网打包

访问官网:https://start.spring.io/

指定项目构建方式 Maven,选择语言 Java。

Spring Boot 选择最新稳定版本 2.4.2,项目元数据填写组织和项目相关信息。

右侧依赖选择自己会用到的包,这里我选择了 Lombok 和 Spring Web,前者帮我们少写代码,后者支持 web 页面访问,方便我做演示。

然后点击底下的 GENERATE 按钮,网站会自动生成 zip 包并且下载到本地。

解压后,我们就可以看到如下的目录结构。HELP 是帮助文档,mvnw 是程序启动命令文件,pom 放置了项目依赖,src 包含了项目的源代码。

IDE 生成

接入插件:

  • 进入 IntelliJ IDEA 的偏好设置,在 Plugins 里搜索 Spring Boot,方框框上打钩,使插件生效。
  • 按提示重启 IDE,即可使用。

spring_boot_plugin

进入 IntelliJ IDEA,点击创建新项目。

ide_rukou

选择 Spring Initializr,指定项目的 Java SDK,选择默认的启动方式,该方式需要联网,点击下一步。

choose_maven

默认需要填写以下信息,如图:

start_input

我改了下名字,叫 course,表明是教程网站的一个项目。同时我把默认的 Java 版本降到了 8,因为这个版本我比较常用。

start_input_java4u

点击下一步,我们看到的是添加依赖的页面,支持关键词搜索,你可以选取自己需要的依赖包。实际效果和官网页面是一致的,这里我依然选择了 Lombok 和 Spring Web。

spring_dep

点击下一步,设置项目名和路径,名称默认取之前 Maven 设置里的 artifact 的值,我一般不会改。

new_project_name

点击完成,IDE 就帮我们建好了 Spring Boot 的项目,文件结构和我们官网下载的包是一致的。

project_page_home

项目会为我们生成一个应用程序启动入口,选中 main 方法运行,这个 Spring Boot 程序就跑起来啦。

以下是启动日志记录,右上角的红色方块代表运行中。再点下红色方块,控制台就会提示程序退出,右上角方块也会变灰。

running_spring_boot

除了利用 IDE 启动 Spring Boot 外,还可以使用项目生成的命令行工具。定位到项目的家目录下,执行以下命令(MacOS/Linux):

./mvnw spring-boot:run

Windows 用户执行以下命令:

mvnw spring-boot:run

会看到这个 Spring Boot 项目从构建到编译再到部署的全过程。

cmd_run_1

cmd_run_2

如果想要终止应用程序的话,Ctrl + C 即可。

cmd_stop

刚才的演示过程是没有涉及到 Web 页面的,那如果想看到页面的访问效果,该怎么做呢?

添加 Web 代码

Web 相关的依赖我们在建项目的时候已经引入了,因此只需要增加相关的代码即可。

首先定位到文件 CourseApplication.java,然后在启动类上增加注解 @RestController,同时添加一个 web 访问的方法。

@SpringBootApplication
@RestController
public class CourseApplication {

public static void main(String[] args) {
SpringApplication.run(CourseApplication.class, args);
}

@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello %s!", name);
}

}

此时启动 Spring Boot,然后打开浏览器访问 http://localhost:8080/hello,就可以看到默认的输出了。为什么端口是 8080 呢?你回去看下启动日志的截图,会发现项目用了 Tomcat 的 Web 服务器,HTTP 的初始化端口是 8080。

default_web_output

当然也可以带参数去访问这个 Get 请求,比如下面这种访问。

spec_web_output

端口我们也可以自己指定,放到应用配置文件 application.properties 中即可。

默认的 8080 修改为 9090


server.port=9090

重启程序后,日志打印发生了变化,浏览器访问同样要用新配置的端口才能访问成功。

好了,快速构建 Spring Boot 应用的介绍就到这里,如果对你也有用的话,可以给我点个赞,点个在看,也可以分享给身边朋友,非常感谢读者朋友。

我是蜗牛,正在互联网上疯狂爬行,下期见。


查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-12-06

彩云小译:最佳的网页翻译插件

前言

当你浏览一些国外网站的时候,看到英文会不会头大?

英文不好的你可能就直接关闭页面了,当然也有朋友硬着头皮去翻译,不过大多数人的操作就是,复制一段内容,粘贴到翻译网站搞明白原文意思,然后再复制粘贴,如此循环往复,直到读懂页面内容。

但这样操作一是 比较麻烦 ,二是 影响阅读体验

那么有没有一个工具,能帮助我们加载网站页面的时候就能看到翻译后的内容,最好原内容也不要替换掉,这样遇到不通顺的地方也可以人肉校准。

满是英文的网页

我今天看资料的时候,就发现了这么一款工具,非常简单好用,接下来就介绍下它。

工具介绍

这个神器是一个谷歌浏览器扩展插件,名字叫 彩云小译 。它能够通过双语对照的方式进行网页翻译,可以一键高效的让你获得母语级阅读体验。

以下是这个插件截图和相关设置。

插件设置

可以看到,它像很多同类插件一样支持划词翻译,同时提供语音朗读。

划词和朗读

不过它的杀手锏是网页翻译。会识别英语和日语,手动或自动翻译成中文。喜欢自动翻译的话,设置里打个勾就行。翻译字幕默认显示也提供「双语对照」、「只显示原文」和「只显示译文」三种设置。你可以按需配置,我比较喜欢双语对照模式,如下图。

双语对照效果

工具使用

有条件科学上网的朋友,可以直接在 chrome 网上应用商店搜索 彩云小译 ,添加至 chrome 即可使用。

另外一部分朋友就需要下载插件源文件,打开谷歌浏览器的开发者模式,将源文件拖入该地址下:chrome://extensions/ ,安装即可使用。

需要插件源文件的朋友,可以后台回复 chrome_plugin_cyxy 获取下载链接。

这里也有官方发布的安装和使用的短视频。

这款工具简单又好用吧,如果对你有用的话,可以给我点个赞,分享给身边朋友,非常感谢读者朋友,也欢迎关注我,我会分享更多优质原创内容


查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-28

最佳的思维导图生成工具——markmap 使用教程

前言

相信很多程序员朋友都有在用 Markdown 吧,我是大三找实习工作的时候接触到的,简历就是用 Markdown 写的。

Markdown 的好处是专注码字的同时还能兼顾排版,不用像 word 那样文本加个粗都需要移动下鼠标,体验非常好。

它的缺点就是可视化能力很弱,这就降低了信息的传播效率,毕竟人对于图像化内容的接收程度要强于文本。

可视化表达方面,思维导图就很不错。它作为一种图象化工具,通过层级式发散式地组织主题,帮助我们更好的记忆、学习和思考。

但在过去,这两类工具是各自独立的,也就是你写完 Markdown 文本,想要可视化地传达一些重点给读者,就需要重新录入下思维导图,因此比较繁琐,这也是我不怎么用思维导图的原因。

不过最近我发现一款很好用的工具,可以很好的解决上边的问题,在此分享给大家。以下是本文的重点内容对应的思维导图,就是用这款工具生成的。

本文重点

工具介绍

这款工具叫 markmap

markmap 可以将 Markdown 语法的文本通过思维导图的方式进行可视化。以下是官网截图,markmap 这个名字来自 markdown 的前半部分 和 mindmap 的后半部分,slogan 是 Visualize your Markdown with mindmaps 。

官网页面

工具使用

在线版

如果你不想安装任何东西,那可以直接浏览器(建议 chrome 浏览器)上访问 https://markmap.js.org/repl 即可仿照官网模板进行转换,如下图。左边录入 Markdown 文本,右边会实时展示出思维导图。

使用页面

Markdown 语法中的链接,加粗,删除线,斜体,单行代码,代码块,数学公式,转换成思维导图都有相应的视图效果。而且支持下载生成动态化的 html 文件以及 svg 文件。

动态化效果如下图,可以折叠和打开。

动态效果

离线版

如果你想拥有更好的使用体验,并且希望在断网的情况下也能够使用,那我推荐你下面这种方案。

在 Visual Studio Code 上安装 markmap 插件,如下图。

vscode 使用插件

编辑 Markdown 文本,文件名以 .mm.md 结尾即可使用,并且可以点击右下角「export」按钮导出动态的 html 文件。

vscode 使用界面

这款工具简单又好用吧,如果对你有用的话,可以给我点个赞,分享给身边朋友,非常感谢读者朋友,也欢迎关注我,我会分享更多优质原创内容


欢迎关注我

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-27

07. struts2中对Action的管理方式

web.xml配置文件的常用代码

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

StrutsPrepareAndExecuteFilter

  • Struts2核心控制器,它只负责拦截由<url-pattern>/*</url-pattern>指定的所有用户的请求
  • 当用户请求到达时,系统会根据web.xml中配置Filter过滤用户的请求
  • 默认情况下,如果用户的访问路径不带有后缀或者是以.action的后缀作为结尾,这时候请求会转发给Struts2框架处理,否则Struts2会滤过这个请求处理
  • 当请求转入Struts2框架时会先经过一系列的拦截器,然后再到Action

Action在struts1和struts2中的区别

  • Struts2会对每个请求都会产生一个Action,所以Struts2是线程安全的,属于原型设计模式。
  • Struts1中的Action创建出来之后会放在缓冲中,属于单例设计模式,在应用生命周期之内只会存在一个Action。

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-27

06. struts2中指定struts2处理的请求后缀

概述

  • 默认情况下我们都是使用.action后缀访问Action。
  • 其实默认后缀是可以通过常量”struts.action.extension“进行修改的。
  • 我们可以配置Struts 2只处理以.do为后缀的请求路径

    • <struts>  
          <constant name="struts.action.extension" value="do"/>  
      </struts>  
  • 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:

    • <constant name="struts.action.extension" value="do,go"/>
  • 一些常用的常量

    • <!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出 -->  
      <constant name="struts.i18n.encoding" value="UTF-8"/>  
      
      <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
           如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->  
      <constant name="struts.action.extension" value="do"/>  
        
      <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->  
      <constant name="struts.serve.static.browserCache" value="false"/>  
        
      <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->  
      <constant name="struts.configuration.xml.reload" value="true"/>  
        
      <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->  
      <constant name="struts.devMode" value="true" />  
        
      <!-- 默认的视图主题 -->  
      <constant name="struts.ui.theme" value="simple" />  
        
      <!– 与spring集成时,指定由spring负责action对象的创建 -->  
      <constant name="struts.objectFactory" value="spring" />  
        
      <!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。 -->  
      <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
        
      <!--上传文件的大小限制-->  
      <constant name="struts.multipart.maxSize" value=“10701096"/>  

常量定义位置

  • 常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置
  • 两种配置方式如下:

    • 在struts.xml文件中配置常量
    • <struts>  
          <constant name="struts.action.extension" value="do"/>  
      </struts>  
    • 在struts.properties中配置常量

      struts.action.extension=do
  • 也可在多个配置文件中进行定义

struts2加载常量的搜索顺序

  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml
如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-26

05. struts2中为Action属性注入值

概述

  • struts2为Action中的属性提供了依赖注入功能
  • 在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供get,set方法。

配置

<action name="helloworld" class="com.liuyong666.action.HelloWorldAction">
    <param name="savePath">/resource</param>
    <result name="success">/WEB-INF/page/hello.jsp</result>
</action>

对应类中的变化

public class HelloWorldAction{
      private String savePath;

      public String getSavePath() {
          return savePath;
      }
      public void setSavePath(String savePath) {
          this.savePath = savePath;
      }
       ......
}

好处

  • 上面通过<param>节点为action的savePath属性注入“/resource”,可以再hello.jsp页面获取/resource
  • 为action注入属性值应用于经常换的变量,这样不用更换源代码。
  • 比如该变量为使用该软件公司的名称

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-24

04. struts2中Result配置的各种视图转发类型

概述

<action name="helloworld" class="com.liuyong666.action.HelloWorldAction">
    <result name="success">/WEB-INF/page/hello.jsp</result>
</action>
  • result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有:

    • dispatcher(默认值)
    • redirect(重定向)
    • redirectAction
    • plainText
  • 通过type属性值指定。

结果类型

  • redirect

    • 在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:
    • <result type="redirect">/view.jsp?id=${id}</result>
  • redirectAction

    • 如果重定向的action在同一个包下:
    • <result type="redirectAction">helloworld</result>
    • 如果重定向的action在别的命名空间下:
    • <result type="redirectAction">
              <param name="actionName">helloworld</param>
              <param name="namespace">/test</param>
      </result>
  • plainText

    • 显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。
    • <result name="source" type="plainText">
              <param name="location">/xxx.jsp</param>
              <param name="charSet">UTF-8</param><!-- 指定读取文件的编码 -->
      </result>

全局结果集(Globle Result)

  • 当有多个Action使用同一个结果集时,则可以使用全局结果集(Globle Result),如下:
  • <global-results> <!-- 定义在包里 -->
             <result name="mainpage">/main.jsp</result>
    </global-results>
  • 多个包想使用同一个结果集,可以利用包的继承,实现代码重用。

    • 创建一个名叫"base"的package,让它继承"struts-default"
    • 该package里放入共用的global-results
    • 想要使用该结果集的包继承"base"

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-24

03. struts2中Action配置的各项默认值

Action中的各项默认值

  • Action各项配置

    • <action name="helloworld" class="com.liuyong666.action.HelloWorldAction" method="execute" >
          <result name="success">/WEB-INF/page/hello.jsp</result>
      </action>       
  • Action默认配置

    • <action name="helloworld">
          <result>/WEB-INF/page/hello.jsp</result>
      </action>
  • 默认值

    1. 如果没有为action指定class,默认是ActionSupport。
    2. 如果没有为action指定method,默认执行action中的execute() 方法。
    3. 如果没有指定result的name属性,默认值为success。

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-24

02. struts2中Action名称的搜索顺序

搜索顺序

  1. 获得请求路径的URI,例如URL为:http://localhost:8080/struts2/path1/path2/path3/student.action
  2. 首先寻找namespace为/path1/path2/path3的package,

    • 如果不存在这个包,则执行步骤3;
    • 如果存在这个 package,则在这个 package 中寻找名字为 student 的 action,当在该 package下寻找不到 action 时就会直接跑到默认 namespace 的 package 中寻找 action (默认的命名空间为空字符串""),如果在默认 namespace 的 package 中还找不到该 action,页面会提示找不action。
  3. 寻找namespace为/path1/path2的package,

    • 如果不存在这个package,则执行步骤4;
    • 如果存在执行步骤2中的代码块中内容。
  4. 寻找namespace为/path1的package,

    • 如果不存在这个package,则执行步骤5;
    • 如果存在执行步骤2中的代码块中内容。
  5. 寻找namespace为/的package,

    • 如果存在这个package,则在这个package中寻找名字为student的action,
    • 当在package中找不到action或者不存在这个package时,都会去默认namespace的package里面寻找actin,
    • 如果还是找不到,页面会提示找不到action。

查看原文

赞 0 收藏 0 评论 0

蜗牛互联网 发布了文章 · 2020-11-24

01. struts2介绍

struts2优点

  • 与Servlet API 耦合性低。无侵入式设计
  • 提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能
  • 支持多种表现层技术,如:JSP、freeMarker、velocity等
  • 输入校验可以对指定方法进行校验,解决了struts1长久之痛
  • 提供了全局范围、包范围和Action范围的国际化资源文件管理实现

搭建struts2开发环境

1. 导包

  • struts2-core-2.x.x.jar:核心类库
  • xwork-2.x.x.jar:XWork类库,struts2在其上构建
  • ognl-2.6.x.jar:对象图导航语言,struts2通过其读写对象属性
  • freemarker-2.3.x.jar:struts2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包,struts2使用这个日志包来支持log4j和jdk1.4+的日志目录
  • commons-fileupload-1.2.1.jar:文件上传组件,2.1.6后必须加入此文件

2. 配置web.xml文件

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • struts2框架通过Filter启动
  • StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作
  • struts2读取到struts.xml的内容后,以JavaBean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件

3. 编写Action类,这是我们的逻辑控制器

package com.liuyong666.action;

public class HelloWorldAction {
    private String msg;
    
    public String getMessage() {
        return msg;
    }

    public String execute(){
        msg = "我的第一个struts2应用";
        return "success";
    }
}

4. 配置src/struts.xml,核心配置文件中配置action

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <package name="liuyong666" namespace="/test" extends="struts-default">
        <action name="helloworld" class="com.liuyong666.action.HelloWorldAction" method="execute" >
            <result name="success">/WEB-INF/page/hello.jsp</result>
        </action>
    </package> 
</struts>
  • 在struts2中使用包管理Action
  • 配置包时必须指定name属性,可以任意名,但必须唯一
  • namespace定义该包的命名空间,为访问该包下Action的路径的一部分,如上边例子的访问路径为:/test/helloworld.action。也可以不配置
  • 继承struts-default包,该包拥有struts2提供的核心功能,拥有各种拦截器。
  • 包可通过abstract="true"定义为抽象包,抽象包中不能包含action

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 74 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-09-19
个人主页被 755 人浏览