基于配置文件的简单Controller

工具:

IntelliJ IDEA 2018.2.5 (Ultimate Edition)
JRE: 1.8.0_152-release-1248-b19 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

 新建两个工程UseSC与SimpleController,所有的配置文件写在UseSC的资源目录下,SimpleController项目打成jar包来进行加载。

1. 实现成果

        e2https://github.com/saaaaaail/J2eee2

2. E1 中的控制器修改为基于配置文件的控制器。

2.1 E1 中的工程 UseSC 配置 web.xml 中定义的servlet-mapping 修改为:可以拦截“*.sc”类型的请求,如 Http//host/request_action.sc

修改url-pattern标签,可以拦截“*.sc”标签,

2.2 UseSC 工程中新建源码包 water.ustc.action,在该包下声名 POJO LoginActionRegisterAction 等,每个 POJO 类可以有不同功能的方法,所有方法均返回 String 类型的结果。针对 POJO 类方法的返回值,分别自定义对应的视图 jsp html

创建LoginAction和RegisterAction类并按照下面的controller.xml文件,分别创建handleLogin方法,并返回”success”、”failure”字符串,创建handleRegister方法,并返回”success”字符串,

并按照controller.xml文件配置pages目录,并定义welcome.jsp文件和failure.jsp文件,

 

2.3 UseSC 工程中 src 下新建 controller.xml,在其中配置若干<action><result>。示例如下:

按照上图要求,在resourses目录下创建controller.xml文件,并配置若干<action>与<result>标签,

2.4  修改 SimpleController 工程的类 SimpleController 源码, 当一个 http request 请求访问 web container 资源时,由 doPost() 对请求进行处理:获取请求(action)的名称。

当一个http请求访问Servlet容器时,在Servlet中通过request对象获得请求的uri,并截取最后的/action.sc中action名称,

 

2.5 SimpleController 获取请求 action 名称后,解析使用simple-controller.jar 库的工程(对于当前即为 UseSC 工程) 配置文件 controller.xmlXML 解析,SAXDom 或其他),查找对应 name action。如果在 controller.xml 中找到,则解析该 action 的配置。如果没有找到,响应客户端信息为:不可识别的 action 请求。

首先构建xml解析的工具类XmlUtil,构建解析xml文件的方法,使用DOM来解析,首先获取controller.xml文件的所有action节点的list,遍历所有action节点,获得每个节点所有属性,使用节点的name属性与请求的antionName进行比较,若相等则action匹配成功,

若action没有匹配,则返回”action:failure”字符串,

2.6   SimpleController 查找到 http request 请求的 action 后, 利用其 class 属性实例化所指向的类( Java 反射机制,Reflection),并执行指定的 method 方法。

在解析controller.xml与action匹配成功后,获得了类地址classString,类中某方法名methodString,则使用Class.forName方法获得类的Class对象,调用getMethod方法获得method对象,调用方法的invoke方法执行该类方法,即执行了该Action方法,并获得了返回结果字符串保存到resultString中,

2.7   method 方法执行完毕后,返回字符串作为请求结果。SimpleController 根据请求结果,查找此 action <result>结点的 name 属性,若找到,将 value 指向的资源按 type 所定义的方式返回到客户端。如果没有匹配的<result>,响应客户端为信息为:没有请求的资源。

调用了Action方法后,返回了执行结果的字符串resultString,然后获得Action标签的result子标签list,遍历子标签,保存result标签的name、type、value属性,使用result标签的name属性与resultString比较,若匹配,则返回type属性与value属性组成的字符串,

若没有匹配的result name属性,则返回’’result:failure”字符串,

至此controller解析完成,不论解析结果如何均返回了一个字符串,根据返回结果进行跳转操作,由于Xml解析方法中没有request和response对象,因此只完成返回字符串操作,在SimpleController类中接受result字符串,并解析是哪一种字符串,并执行相应的打印输出与跳转操作,

2.8为了使得 SimpleController 类的代码简洁,建议自主添加 SimpleController 工程为 simple-controller.jar,并将该 jar 添加为UseSC lib 库。

2.9 UseSC 部署在 tomcat 中测试,验证当浏览器请求对应的 action 时,是否能够响应正确的视图。如果有错,调试程序直到输出期望结果

请求http://localhost:8080/login.sc

返回success字符串

控制台依次打印:(actionName、获得controller.xml文件地址、执行Action对应方法、result字符串返回结果)

 

请求http://localhost:8080/login.sc

当返回failure字符串,进行请求重定向,请求地址发生了变化,

控制台依次打印:(actionName、获得controller.xml文件地址、执行Action对应方法、result字符串返回结果)

 

请求http://localhost:8080/register.sc

返回success字符串

控制台依次打印:(actionName、获得controller.xml文件地址、执行Action对应方法、result字符串返回结果)

 

猜你喜欢

转载自blog.csdn.net/y649014081/article/details/88229504