Struts框架的引入与原理

来源:互联网 发布:unity3d socket服务端 编辑:程序博客网 时间:2024/06/03 11:48
通过Filter解决问题
PoJo类:Plain old object
不引用其他的jar包类,就引用jdk自带的类
例子:
class LoginAction{
void execute{
….
}
}




/bjpowernode/login 如何访问loginAction类中的execute方法




伪代码实现:
使用Servlet

class loginServlet{

doPost(requst,response){
new LoginAction().execute();
}
}






不使用Servlet,如何实现:
思路:处理请求的有Servelt,过滤器Filter




class LoginFilter{
doFilter(req,res,chain){
new LoginAction().execute();
}
}




新的需求2:


如果有多个请求,就需要在添加多个过滤器去处理这个请求(这样不好),
所以我们需要引用/定义一个核心的过滤器,起到一个总体控制的作用
把所有的请求处理掉


怎么做?


map集合是一个key对应一个value


把一个请求当做一个key,要调用的方法当做value
找到全限定性类名,可以通过反射找到给方法


class CoreFilter{

doFilter(req,res,chain){
map.put("/bjpowernode/login","xxx.jj.LoginAction");
map.put("/bjpowernode/register","xxx.jj.RegisterAction");

//1.获取到请求即URL
String path= request.getServeltPath();
//2.通过请求从map中获取到全限定性类名
String className = map.get(path);
//3.使用反射机制根据全限性类名创建对象
Object obj = Class.forName(className).newInstance();
//4.调用方法
obj.getClass().getMethod("execute").invoke(obj,null);

}
}


新的需求3:


class LoginAction{
void execute{
….
return "success"
}
}


class RegisteAction{
void execute{
….
return "fail"
}
}


返回成功有个页面:/welcome.jsp


返回失败:/fail.jsp


根据不同的返回,跳转到不同的页面?
如何做


一个Filter全部搞定:
class CoreFilter{

doFilter(req,res,chain){
map.put("/bjpowernode/login","xxx.jj.LoginAction");
map.put("/bjpowernode/register","xxx.jj.RegisterAction");
map.put("success","/welcome.jsp");
mpa.put("fail","/fail.jsp");
........

//1.获取到请求即URL
String path= request.getServeltPath();
//2.通过请求从map中获取到全限定性类名
String className = map.get(path);
//3.使用反射机制根据全限性类名创建对象
Object obj = Class.forName(className).newInstance();
//4.调用方法,得到返回值
String resultKey = obj.getClass().getMethod("execute").invoke(obj,null);
//5.通过方法返回值,从map中获取到要跳转的页面
String page = map.get(result);
//6.完成跳转(跳转有2中方式:一种是重定向,一种是?)
请求跳转:
request.getRequestDispatcher(page).forward(request,response);
重定向:
response.redirect(page);
}
}
有个问题,一旦有新的请求,我需要在添加代码,即修改了源码。
但我们不可能该甲方源码。


重新编译:保存就编译了
但我们(乙方)的代码禁止放在甲方的服务器上,在去编译源码。
一旦甲方得到了源码,就可以找其它公司去开发。花费成本就低了。
就不在找你公司二次开发了




怎么办?
这就引出配置文件了:
常见的文本文件格式


properties
xml
两种区别:
properties里面放的是键值对
xml里面放的是标签,子标签里放子标签
properties:
文件相对较小,没有多余数据,语义性差
xml:有很多多余数据(相对于有用的数据),但可读性强,语义性强,文件相对较大


一般properties文件一般放简单的连接数据的jdbc的驱动,url,数据库名和密码
不放大量的数据
如果有大量的数据,一般放xml文件




使用xml文件放入数据:
xml标签随便定义


<package name="ooo">
<action name(名字随便取)="/bjpowernode/login" class="xxx.jj.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
<action name(名字随便取)="/bjpowernode/register" class="xxx.jj.RegisterAction">
<result name="fail">/fail.jsp</result>
</action>
</package>
科学管理
同一类的放入同一组里
struts2也已经规范好了这个配置文件,名称必须要叫struts2.xml


<package name="ooo" namespace="/bjpowernode">
<action name(名字随便取)="/login" class="xxx.jj.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
<action name(名字随便取)="/register" class="xxx.jj.RegisterAction">
<result name="fail">/fail.jsp</result>
</action>
</package>


<package name="aaa" namespace="/admin">
<action name(名字随便取)="/login" class="xxx.jj.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
<action name(名字随便取)="/register" class="xxx.jj.RegisterAction">
<result name="fail">/fail.jsp</result>
</action>
</package>


class CoreFilter{

doFilter(req,res,chain){
map.put("/bjpowernode/login","xxx.jj.LoginAction");
map.put("/bjpowernode/register","xxx.jj.RegisterAction");
map.put("success","/welcome.jsp");
mpa.put("fail","/fail.jsp");
........

//0.加载配置文件。(如果文本文件被修改了,只需重启服务就行了)

//1.获取到请求即URL
String path= request.getServeltPath();
//2.通过请求从map中获取到全限定性类名
String className = map.get(path);
//3.使用反射机制根据全限性类名创建对象
Object obj = Class.forName(className).newInstance();
//4.调用方法,得到返回值
String resultKey = obj.getClass().getMethod("execute").invoke(obj,null);
//5.通过方法返回值,从map中获取到要跳转的页面
String page = map.get(result);
//6.完成跳转(跳转有2中方式:一种是重定向,一种是?)
请求跳转:
request.getRequestDispatcher(page).forward(request,response);
重定向:
response.redirect(page);
}
}




这就是struts2的工作原理
struts2中定义好了这个核心Filter,叫StrutsPrepareAndExecuteFilter
struts2也已经规范好了这个配置文件,名称必须要叫struts2.xml
原创粉丝点击