工具:
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. 实现成果
e2:https://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 类 LoginAction、RegisterAction 等,每个 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,在其中配置若干
按照上图要求,在resourses目录下创建controller.xml文件,并配置若干
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.xml(XML 解析,SAX、Dom 或其他),查找对应 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 中
调用了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字符串返回结果)