这几天我学了struts第一个框架,虽然好多人都说这个框架很少人会用,但是我还是觉得学好了第一个框架,才能对后面的框架可以进行更好的学习,另外我也通过这几天在课上的学习,充分的发现自己的学习的基础知识真的是很不扎实,。我也不知道怎么办了。反正要好好学习,但是自己也一定要在学习新的东西的基础上好好掌握前面的知识,温故而知新,可以为师已。我是牢牢的记住的,好了,不废话多说了。现在就好好的整理我这几天学习的struts框架吧!
首先呢,我还是想画上一张图这个图可以很好的表达出struts 上面就是这张图就是struts原理的东西,这里一个很新颖的地方就是这个中央控制器这个地方,之前没有了解过,老师也说过,在面试的时候,如果有人问你struts核心的东西,就好是用一句话就可以解释的出来,这里我就尝试用一句话说出来,所有的*.do请求(包括*.action等等)都会被中央控制器,ActionServlet接受到,然后找到struts-config.xml配置文件,找到里面的相应的Action,再去调用execute方法,execute方法会返回相应的forward跳转信息,然后再根据相应的跳转信息,中央控制器再去进行统一的跳转!
上面一句话就是我对于struts的理解,肯定是有一些不妥的地方,但是毕竟是根据老师讲的,和自己学习地方来进行总结的,所以也算是有点小收获吧,老师还给我们模拟了一段中央控制器的代码,以便我们可以更好的掌握控制器这个概念的理解,这里我也贴出来。以便以后大家的复习,
package com.daijianwei.servlet; import java.io.IOException; import java.util.Iterator; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.daijianwei.action.Action; public class ActionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.process(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.process(request, response); } private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = request.getRequestURI(); url = url.substring(0, url.indexOf(".")); url = url.substring(url.lastIndexOf("/")); SAXReader reader = new SAXReader();//创建对象 Action action = null; Document document = null; Boolean isRedirect = true; Iterator<Element> forwardelement = null; try { //读取文件 document =reader.read( ActionServlet.class.getClassLoader().getResource("struts_config.xml")); Element rootelement = document.getRootElement();//拿到根路径 Iterator<Element> i = rootelement.elementIterator("action");//再去找到根路径下名字为action的值 while(i.hasNext()){ Element actionelement = i.next();// 循环的进行迭代 if(url.equals(actionelement.attributeValue("path"))){//判断值是否相等 try { action =(Action) Class.forName(actionelement.attributeValue("type")).newInstance();//再去new出对象 forwardelement = actionelement.elementIterator("forward");//拿出forward的值放到容器中去 String a = actionelement.attributeValue("redirect"); if(a!=null){//判断是否为服务器内部转发还是客户端跳转 isRedirect = Boolean.parseBoolean(a); } } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } String actionforward = null; String forwardName = action.execute(request, response); while(forwardelement.hasNext()){//对forward的里面的值进行迭代的输出 Element element1 = forwardelement.next(); if(forwardName.equals(element1.attributeValue("name"))){ actionforward = element1.attributeValue("path"); } } if(isRedirect){ response.sendRedirect(actionforward); }else{ request.getRequestDispatcher(actionforward).forward(request, response); } } }
上面是对中央控制器的一些模拟写法,虽然只是模拟的写法但是也是对struts这里面的一些理解,这一点不得不佩服老师,讲解的很好啊。我一下子就理解了!另外我也把配置文件的代码也贴出来,
<?xml version="1.0"?> <root> <action path="/addUser" type="com.daijianwei.action.AddAction"> <forward name="ok" path="ok.jsp"></forward> </action> <action path="/delUser" type="com.daijianwei.action.DelAction" redirect="false"> <forward name="ok" path="del_ok.jsp"></forward> </action> </root>
上面就是我xml代码,这个代码的过程,就是模拟登陆的,以前学习的都是MVC设计模式,现在把一小部分的代码用struts来代替,。现在感觉很方便了,也很好用!以后做项目的时候也可以很好的整合了。虽然这只是1.0版本的struts好多人都说没有什么用,但是这也是为我以后的学习的打下很好的基础了吧!
今天的整合就这样了,我还在学习当中,以后我还会整理我的笔记,。慢慢让自己掌握更多的学习struts的东西!