- 在服务器客户机模式中,当客户机发送一个请求客户端应当如何处理呢?比如客户端发送一个登录的请求,服务器端应当去调用处理登录的方法,即服务器就要根据请求做出对应的响应。
- 实际上其过程就是客户机上执行某一个方法,将方法返回值,通过网络中传输的流的方式传输给服务器,服务器找到该请求对应的响应方法,并执行,将结果再次通过字节流的方式传输给客户机!以此来进行通信。
但是客户端的请求是多种多样的,我们需要判断到低是哪种请求,比如下面这样写的代码不利于维护(且满眼的if else也尽显低级)。且也有类似在客户端需要执行响应的方法但方法会在不同的模块中,亦不能用if else去处理。
public class Action{
public void dealRequest(String stream) {
if (请求是登录){
判断ID和password是否正确
} else if (请求是退出) {
判断当前能否退出
} else if (请求是..) {
判断...
} else if (请求是..) {
判断...
} else if (请求是..) {
判断...
} else if (请求是..) {
判断...
} else if (请求是..) {
判断...
}
}
}
于是我们可以在服务器端做一个可以根据请求自动去调用相应的方法的DealRequest分发器在客户端做一个DealResponse分发器(我们可以用注解标识的方法去解决)
可以用三个注解:此类可命名为ActionClass,拥有这个注解的类才可进行扫描,其表明此类中有要调用的方法
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface ActionClass {
}
此类可命名为Action,拥有这个注解的方法才可放入之后的Map中去,其中name可以当做map中的键值
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target(METHOD)
public @interface Action {
String name();
}
因为调用方法需要用到反射机制所以得获取参数的类型,则下面这个类可命名Para,用来标记方法的参数的,其中的name的赋值是为了以后找到对应的参数。
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Para {
String name();
}
此时当在需要调用的方法上写上这些注解,例子如下:
import com.htt.Annotation.Action;
import com.htt.Annotation.ActionClass;
import com.htt.Annotation.Para;
import com.htt.stu_mis.student.model.StudentModel;
@ActionClass
public class StudentAction {
public StudentAction() {
}
@Action(name =