Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目

Posted TheMagicalRainbowSea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目相关的知识,希望对你有一定的参考价值。

Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目

每博一文案

有句谚语说:“一怒之下踢石头,只有痛着脚趾头。”
比一件糟糕的事情更可拍的,是你用糟糕的态度去面对它。看过一个很有意思的故事:
有个男人清早洗漱的时候,把自己的手表放在了桌子上。他的儿子不小心把手表碰倒地上摔坏了,男人
气得儿子揍了一顿,还埋怨妻子没看好儿子,两个人吵了起来。
男人气急败坏地摔门出去,路上想起有一份重要文件忘记带了,他匆忙回家取。可没有人在家,
他只得打电话让妻子回来送钥匙。妻子赶回家时,不小心撞翻了路边的一个小吃摊,赔了一笔钱。
男人没等到妻子回家,因为迟到也遭受了罚款。
费斯汀格法则认为:“10%的生活,由发生在你身上的事情组成,而另外的90%,则取决于你做出的反应。”
这个故事中。摔坏手表就是其中10%,而后面的一系列的事情则是另外的90%,是由埋怨引起的。
面对人生得失时,一颗平常心,比一百种智慧更有力量。
人这一生,得与失,都是常态。不是此处得,彼处失,就是彼处得,此处失,得得失失,失失得得,才构成了“人间事”。
正如席慕容的那首诗《写给幸福》:“挫折会来,也会过去。热泪会流下来,也会收起。没有什么
可以让我气馁的,因为我有着长长的一生。”
别为昨日忧愁,别为琐事烦忧,因为真正的人间清醒,是努力活着。
余生,愿你所有快乐,无需假装;愿你此生尽兴,赤诚善良。
                                   ——————  《一禅心灵庙语》

@

1. web.xml 的缺点分析

分析 oa项目中的 web.xml文件 具体的可以移步至:

自定义注解的简单使用

        框架开发时不免会涉及到配置文件,如properties、xml以及txt等格式的文件。这里介绍框架中通过自定义注解的形式简化配置:

 


 

  • 根据需求编写自定义注解中的属性(这里以JDBCConfig为例,这是一个注入数据库常用配置的注解类)

 

  @Target是java的元注解(即修饰注解的注解),这里的@Target({METHOD,TYPE})指可以修饰方法、描述类、接口(包括注解类型) 或enum声明。

  @Retention是java中的运行时注解,可以划分为三类

      1.RetentionPolicy.RUNTIME:注解不仅会被保存到class文件里,在jvm加载class文件之后仍然不会消失。

    2.RetentionPolicy.CLASS:注解会被保留到class文件里,但jvm加载class文件时被遗弃,默认的生命周期如此。

    3.RetentionPolicy.SOURCE:注解只会保留在源文件中,当java文件变异成class文件shi

   @Inherited:允许子类继承父类的注解

   @Documented:注解表明制作javadoc时,是否将注解信息加入文档。(添加时表示制作javadoc时将注解会加入其中)

package com.ssm.test.anno;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// jdbc:sqlserver://localhost:1433;DataBaseName=sqlserverdb
/**
 * @Title: JDBCConfig.java
 * @Package ctl.anno
 * @Description: 自定义注解类-->可用于数据库连接
 * @author chentl
 * @date 2017年7月7日14:38:34
 * @version V1.0
 */
@Target({METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {

    String ip();

    int port() default 1433;

    String database();

    String encoding();

    String loginName();

    String password();
    
    String driverName();
}

 


 

  • 接下来直接在数据交互层通过注解的形式注入使用就OK了

 

 

  /**
     * @Title: SelectMethod.java
     * @Package com.ctl.test
     * @Description: 获取数据库连接
     * @author chentl
     * @date 2017/6/8 上午11:16:19
     * @version V1.0
     */
    @JDBCConfig(database = "sqlserverdb", driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver", encoding = "UTF-8", ip = "192.168.1.191", loginName = "sa", password = "123")
    public Connection getConnection() {
        Connection conn = null;
        try {
            JDBCConfig jconfg=DBManager.class.getAnnotation(JDBCConfig.class);
            String url = jconfg.ip();
            String user = jconfg.loginName();
            String password = jconfg.password();
            String driver = jconfg.driverName();
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return conn;
    }
}

 


 

  • 另外,注解不仅可以用于配置信息的注入,还可以在注解中追加对字段的验证哦~这里举个验证的例子。

 

 

    验证注解@NotEmpty源码

package org.hibernate.validator.constraints;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
@NotNull
@Size(min = 1)
public @interface NotEmpty {
    String message() default "{org.hibernate.validator.constraints.NotEmpty.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    /**
     * Defines several {@code @NotEmpty} annotations on the same element.
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        NotEmpty[] value();
    }
}

    使用

   @NotEmpty(message = "密码不能为空", groups = {AccountGroup.Add.class})
    @Size(min = 6, max = 20, message = "密码长度必须在{min}和{max}之间", groups = {AccountGroup.Add.class})
    private String password;

 

以上是关于Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目的主要内容,如果未能解决你的问题,请参考以下文章

注解WebServlet配置Servlet报404错误的原因

@WebFilter("")配置servlet访问出现404的原因

SpringBoot初识

Servlet3.0提供的@WebServlet注解引用参数详情介绍

Servlet3.0学习总结——使用注解标注Servlet

你了解过Servlet3.0吗?