Struts框架的引入与原理

通过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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值