//初次接触自定义框架,简单的登录功能的实现流程::
当我们实现登录功能的时候,首先会创建一个login.jsp
会写这些登录表单
<form action="loginAction.action" method="post"> 姓名:<input type="text" name="name"/><br/> 密码:<input type="text" name="pwd"/><br/> <input type="submit" value="登录"> </form>
//当然我们现在需要做的就是 吧我们自己写的框架在项目启动的时候成功部署
首先我们要在程序启动的时候让程序自行启动一个servlet,并在servlet中写自己框架的流程部署
需要在web.xml 中配置
<!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; -->
<load-on-startup>0</load-on-startup>
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义约束文件 --> <!-- ELEMENT 表示元素 --> <!-- ATTLIST 表示属性 --> <!-- CDATA 表示字符串类型 --> <!-- REQUIRED 表示此属性必须的写 --> <!-- *代表多个 --> <!-- IMPLIED 表示此属性可写 --> <!DOCTYPE Framework[ <!ELEMENT Framework (actions)> <!ELEMENT actions (action*)> <!ELEMENT action (result*)> <!ATTLIST action name CDATA #REQUIRED class CDATA #REQUIRED > <!ATTLIST RESULT name CDATA #IMPLIED redirect (true|false) "false" > ]> <Framework> <actions> <action name="loginAction" class="Action.LoginAction"> <result name="success">success.jsp</result> <result name="login">index.jsp</result> </action> </actions> </Framework>
public void init(ServletConfig config) throws ServletException { //config对象是javax.servlet.ServletConfig的对象,功能是获得初始化配置信息 //config.getInitParameter是取得指定名称的初始化参数内容 String filename = config.getInitParameter("config"); System.out.println("GG\t"+filename); String [] filenames=null; if(filename==null) { //如果没有别的参数信息,就将已经配好的放入数组中 filenames=new String[]{"Framework.xml"}; for (String string : filenames) { System.out.println(string); } } else { //若果有其他的配置参数信息,那么以,分隔存入数组中 filenames=filename.split(","); for (String string : filenames) { System.out.println(string+"\t"); } } //使用init方法初始化 man=new ActionMappingManager(filenames); }
因为标红的代码,所以他就会执行如下代码:
package Action; /** * 步骤三: * 由于action节点不止一个,所以需要配置一个ActionMappingManage类来管理ActionMapping类 */ import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 由于这个类是actions * 所以包含了一个成员变量 定制成key value的形式是因为 * actions 中每一个action 都有他对应的 name值,每一个name代表一个key * 每个action 代表一个 value * @author SLEEP * 解析资源文件中的节点对象 * */ public class ActionMappingManager { //actionMapping类的集合 private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>(); public ActionMapping getActionMapping(String name) { return maps.get(name); } //通过init 装配的xml文件获取actions public ActionMappingManager(String[] files) { for (String filename : files) { Init(filename); } } //创建初始化方法,使用dom4j解析配置文件 public void Init(String path) { System.out.println("呵呵-----------------------------------------"); try { //getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据 //把Framework.xml这个资源对象转换成 流 InputStream is=this.getClass().getResourceAsStream("/"+path); //解析xml 用saxreader 对象去读取流 Document doc= new SAXReader().read(is); //获取根节点 Element root = doc.getRootElement(); //获取自定义框架中的第一个 acitons节点 Element actions=(Element)root.elementIterator().next(); System.out.println("根节点"+actions.getName()); //使用for循环来遍历actions节点下的所有action节点 for(Iterator<Element> action=actions.elementIterator();action.hasNext();) { //获取到<action>节点 action 是一个action的集合 ,我们要取出来第一项 Element actionnext = action.next(); System.out.println("根节点下的子节点"+actionnext.getName()); //分别获取到action节点中的name属性和class属性 String name = actionnext.attributeValue("name"); String classname = actionnext.attributeValue("class"); //将以上两个属性保存到ActionMapping类中 ActionMapping mapp=new ActionMapping(); mapp.setClassname(classname); mapp.setName(name); //由于一个action节点下有多个result节点 遍历action下所有的result节点 for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();) { //获取到result节点 Element resultnext = result.next(); //提取result节点的name属性值和result节点中的值 String resultname = resultnext.attributeValue("name"); String resultvalue=resultnext.getText(); //将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!) mapp.addResult(resultname, resultvalue); System.out.println(mapp.getName()); } //得到所有action节点的集合 maps.put(mapp.getName(), mapp); } } catch (Exception e) { e.printStackTrace(); } } }
//servlet方法中的init 执行完毕之后,我们的tomcat成功开启
当我们点击登录的时候因为是post 请求,所以会自动调用servlet 中的doPost方法如下:
ActionMappingManager man=null; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应 //获取到ActionMapping对象 ActionMapping actionMapping = man.getActionMapping(getname(request)); //获取action接口利用反射机制 Action action = ActionManager.getActionClass(actionMapping.getClassname()); try { //返回一个逻辑视图名 String message = action.execute(request, response); String results = actionMapping.getResults(message); response.sendRedirect(results); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取请求的路径名 例:day01_0100/index.jsp 获取的是index.jsp public String getname(HttpServletRequest request) { //项目+请求地址 String requestURI = request.getRequestURI(); System.out.println(requestURI); //项目名称 String contextPath = request.getContextPath(); System.out.println(contextPath); //具体的请求 String path=requestURI.substring(contextPath.length()); System.out.println(path); String filename=path.substring(1,path.lastIndexOf(".")).trim(); System.out.println(filename); return filename; }ActionMappingManager man=null; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //由于index.jsp为默认请求界面,所以getname方法会获取到index.jsp正好与ActionMappingManager中map的key对应 //获取到ActionMapping对象 ActionMapping actionMapping = man.getActionMapping(getname(request)); //获取action接口利用反射机制 Action action = ActionManager.getActionClass(actionMapping.getClassname()); try { //返回一个逻辑视图名 String message = action.execute(request, response); String results = actionMapping.getResults(message); response.sendRedirect(results); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取请求的路径名 例:day01_0100/index.jsp 获取的是index.jsp public String getname(HttpServletRequest request) { //项目+请求地址 String requestURI = request.getRequestURI(); System.out.println(requestURI); //项目名称 String contextPath = request.getContextPath(); System.out.println(contextPath); //具体的请求 String path=requestURI.substring(contextPath.length()); System.out.println(path); String filename=path.substring(1,path.lastIndexOf(".")).trim(); System.out.println(filename); return filename; }
//因为自定义Mvc没有拦截器,所以<url-pattern>*.action</url-pattern>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<!-- 没有像struts2那样的过滤器,手动限制过滤所有的action -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
这样一个自定义框架就完成了!