1. 打成jar包,并放入指定目录:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
    </configuration>
    </plugin>
    </plugins>
    </build>
  1. 将依赖包拷贝入指定文件夹:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
    <execution>
    <id>copy-dependencies</id>
    <phase>prepare-package</phase>
    <goals>
    <goal>copy-dependencies</goal>
    </goals>
    <configuration>
    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
    <overWriteReleases>false</overWriteReleases>
    <overWriteSnapshots>false</overWriteSnapshots>
    <overWriteIfNewer>true</overWriteIfNewer>
    <includeArtifactIds>*</includeArtifactIds>
    <excludeArtifactIds>isuwang-soa-core</excludeArtifactIds>
    </configuration>
    </execution>
    </executions>
    </plugin>

    这里<includeArtifactIds>表示要包括的包,<excludeAritifactIds>表示排除的包,冲突的情况下以<excludeArtifactIds>为准。

    阅读全文

想要在一个Java项目中自启动一个jetty容器,可以打开站点,显示自定义内容,而不需要引入jetty插件或者Ide支持或者类似tomcat那样启动。并且将项目打成jar包,可以在其他项目中引用。

在使用中碰到一些问题,主要是:

  • jetty包对jsp页面不支持,需要额外引入包,且去掉冲突包;
  • 当项目被打成jar包、被其他项目引用时,要注意jetty Server webAppContext的路径问题

现记录如下:

  1. 引入Jetty包:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>9.3.7.v20160115</version>
    </dependency>
    <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>9.3.7.v20160115</version>
    </dependency>

    是为了让jetty站点支持jsp和jstl,还需要引入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-jsp</artifactId>
    <version>9.2.15.v20160210</version>
    <exclusions>
    <exclusion>
    <groupId>org.eclipse.jetty.orbit</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
    </dependency>

    阅读全文

  1. 引入commons.mail包:

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-email</artifactId>
    <version>1.3.3</version>
    </dependency>
  2. 直接看代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public static void sendReplyEmail(String toEmail, String title, String content) {

    Runnable task = () -> {
    SimpleEmail email = new SimpleEmail();
    // email.setTLS(true); //是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
    email.setDebug(true);
    email.setSSL(true);
    email.setHostName("smtp.qq.com");
    email.setSmtpPort(465); //qq邮箱smtp端口为465或587
    email.setAuthenticator(new DefaultAuthenticator("250********@qq.com", "这里是密码"));
    try {
    email.setFrom("250********@qq.com"); //发送方,这里可以写多个
    email.addTo(toEmail); // 接收方
    //email.addCc("402******@qq.com"); // 抄送方
    //email.addBcc("yuaio@163.com"); // 秘密抄送方
    email.setCharset("GB2312");
    email.setSubject(title); // 标题
    email.setMsg(content);// 内容
    email.send();

    LOGGER.info("...");
    } catch (EmailException e) {
    e.printStackTrace();
    LOGGER.info("...");
    }
    };
    new Thread(task).start();
    }
  1. 其他:

    想使用第三方客户端(比如这里的代码)登陆QQ邮箱,使用smtp服务发送邮件,则需要使用QQ邮箱提供的授权码。具体信息请点这里

概述

有点类似springMVC中的filter,多个filter形成一条过滤链,依次处理一个请求,并传给下一个filter,最后才分发到各个controller进行业务处理。

现在想实现的是这样一种功能,使用一个过滤链处理一个请求:

  1. 时间过滤器在请求开始时记录时间,结束后统计请求时间并打印;
  2. 日志过滤器在请求发送到服务器前打印请求的数据,数据从服务器返回后打印返回的数据;
  3. 其他…

思路

  1. 首先写好fiter和filterChain的接口类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public interface Filter {
    void init();
    void doFilter(FilterChain chain) throws TException;
    void destory();
    }

    public interface FilterChain {
    void doFilter() throws TException;
    Object getAttribute(String name);
    void setAttribute(String name, Object value);
    }
  2. 实现一个过滤链类,implemts FilterChain:

    1. 首先定义一个静态的Filter列表,在向这个列表添加filter之后,所有请求共用这个列表,被filters列表中的filter依次处理;
    2. 定义一个变量Map<String, Object>attributes = new HashMap<>(),每个请求new一个FilterChain,以此保存每个请求各自的一些参数,并将该FilterChain作为参数传递给Filter的doFilter方法,这样,Filter处理不同的请求时,就能从attributes中拿到每个请求不同的参数;

      阅读全文

项目中原本使用的是基于socket的server,后来因为一些原因,需要添加一个http的回调地址,供外部调用,但是总不能修改项目结构,而且只是一个接口需求,不想也不需要重新开个项目丢进服务器,所以直接使用了java自带的HttpServer类,启动一个端口作为http请求的回调地址。

  1. HttpServer代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void start() {
    try {
    server = HttpServer.create(new InetSocketAddress(port), 0);

    server.createContext("/backcall", backCallHandler);
    server.setExecutor(null);
    server.start();

    logger.info("本地监听端口启动成功({})", port);
    } catch (IOException e) {
    logger.error("本地监听端口启动失败(" + port + ")", e);
    }
    }

    public void stop() {
    if (server != null) {
    server.stop(100);
    }
    }

    阅读全文

之前的项目中用到了jquery-template这东西,这里做一下记录,以免遗忘。

Jquery-template的github地址

个人理解,Jquery-template是一个jquery的插件,作用是定义一个html的模板,将一串类似的数据使用模板的样式,添加到html页面的指定位置。

最开始,我在页面中使用ajax获取了一些数据,然后解析这些数据,并手动生成html内容,添加到一个<div>范围内。然而这种做法实在是太笨太丑了,需要不停地append字符串,累赘而不美观,写起来也累。因为是要生成一个table,事实上table中每一行都是类似的,只是数据不同,所以可以使用Jquery-template来定义一个<tr>模板,然后将所有的数据,按照模板的格式、样式添加到指定的<table>

使用方式

  1. 建立一个模板

    1
    2
    3
    <script type="text/html" id="template">
    <tr><td data-content="name" data-format="AddAHrefToDiv"></td><td data-content="doc" data-format="fromMarkDown"></td></tr>
    </script>

    这个模板就是一个列表行,每一行有两列,data-content表示数据来源,data-format表示显示格式。

阅读全文