在上一节,我们自己写的web框架,只能运行显示一个HelloWorld。现在我们对其进行一次加工,让他至少能运行一个登陆程序。

首先看login.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="
    java.util.*,
    javax.servlet.*,
    javax.servlet.http.*,
    com.gc.action.User"%>
<%!public static final String _AppId = "login";%>
<%

    HashMap<String,Object> infoOut=null;
    if(request.getAttribute("infoOut") == null)
        infoOut=new HashMap<String,Object>();
    else
        infoOut=(HashMap<String,Object>)request.getAttribute("infoOut");

    String msg = infoOut.get("msg") == null ? "" : (String) infoOut
            .get("msg");
    User user = infoOut.get("user") == null ? new User()
            : (User) infoOut.get("user");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>采用新的框架实现用户登录验证</title>

<script language=Javascript>
function submit(target, action) {
    form1.target = target;
    form1.action.value = action;
    form1.submit();
}

function check() {
    form1.forwardJsp.value="login"; //再次跳转回来
    form1.logicName.value="LoginAction";
    submit('<%="login_" + session.getId()%>','login');
}
</script>
</head>
<body leftmargin="0" topmargin="0">
               <%-- 这个action 目前没有用 我们可以随意写 --%>
    <form name="form1" action="xx.do"  method="post">
        <H3>
            <font color='red'><%=msg%></font>
        </H3>

                用户名:<input type="text" name="username"><br> <br>
                密码: <input type="text" name="password">
                    <br>
                <input type="button" name="button" value="提交" onClick="return check()">
                <input type="reset" name="button" value="重置"> 

                <%-- 这一次我们要从jsp端发起请求,设置三个参数 --%>
                <input type="hidden" name="action" value="">
                <input type="hidden" name="forwardJsp" value="">
                <input type="hidden" name="logicName"   value="">
    </form>

<script language=Javascript>
    window.name = "<%="login_"+session.getId()%>";
</script>

</body>
</html>

表现层有了,控制层我们可以复用第一节的GdServlet,现在就差模型层了。

package com.gc.action;

import java.util.HashMap;

import com.gd.action.Action;

public class LoginAction implements Action{

    public HashMap<String, Object> doAction(HashMap<String, Object> infoIn) {
        String action = (infoIn.get("action") == null) ? "" : (String) infoIn
                .get("action");
        HashMap<String, Object> infoOut = infoIn;
        if (action.equals(""))
            infoOut = this.doInit(infoIn);
        else if (action.equals("login"))
            infoOut = this.doLogin(infoIn);
        return infoOut;
    }
    /**该方法用来实现没有传入动作时要处理的内容
    * @param infoIn
    * @return HashMap
    */

    private HashMap<String, Object> doInit(HashMap<String, Object> infoIn) {
        HashMap<String, Object> infoOut = infoIn;
        infoOut.put("msg", "请输入用户名和密码");
        return infoOut;
    }

    /**该方法用来实现输出HelloWorld
    * @param infoIn
    * @return HashMap
    */

    public HashMap<String, Object> doLogin(HashMap<String, Object> infoIn){
        HashMap<String, Object> infoOut = infoIn;
        String username = (infoIn.get("username") == null) ? "" : (String)infoIn.get("username");
        String password = (infoIn.get("password") == null) ? "" : (String)infoIn.get("password");

            if ("gd".equals(username) && "123456".equals(password)) {
                infoOut.put("forwardJsp", "success");
                infoOut.put("msg", "登录成功");
            } else if ("gd".equals(username) && !"123456".equals(password)) {
                infoOut.put("msg", "密码错误");
            } else if (!"gd".equals(username) && "123456".equals(password)) {
                infoOut.put("msg", "用户名错误");
            }  else if (!"gd".equals(username) && !"123456".equals(password)) {
                infoOut.put("msg", "用户名和密码都输入错误");
            } else if ("".equals(username) && "".equals(password)) {
                infoOut.put("msg", "请输入用户名和密码");
            }

            return infoOut;

    }
}

infoOut.put(“forwardJsp”, “success”);

如果登陆成功,就返回success.jsp。

注意:本来forwardJsp在login.jsp里就设置了,是login。这里的逻辑是一旦成功登陆,就返回success。

success.jsp

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.sql.*,java.util.*,javax.servlet.*,
         javax.servlet.http.*,java.text.*,java.math.*,com.gd.mvc.io.InfoInAndOut,com.gd.mvc.io.impl.GdInfoInAndOut"
%>
<%! public static final String _AppId = "login"; %>
<%
HashMap<String,Object> infoOut=null;
if(request.getAttribute("infoOut") == null)
    infoOut=new HashMap<String,Object>();
else
    infoOut=(HashMap<String,Object>)request.getAttribute("infoOut");
    String msg = infoOut.get("msg") == null ? "" : (String)infoOut.get("msg");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>采用新的框架实现用户注册验证</title>

</head>
<body leftmargin="0" topmargin="0">
<form name="form1" action="/myApp/do" method="post">
<H3><font color='red'><%=msg%></font><H3>

    <input type="hidden" name="action" value="">
</form>
<script language=Javascript>
    window.name = "<%="login_"+session.getId()%>";
</script>
</body>
</html>

咱们看看效果:



我直接访问了servlet,没有经过jsp那就自然没有用户名与密码了。



点提交之后



别的效果,我就不贴图了,大家应该都能想出来。

在上面的基础上,我们输入下面的地址:

http://localhost:8700/Struts2Demo/gc/df/index.do

肯定是404notfind。

其实也很容易理解

Action action=null;
    String servletPath=req.getServletPath();
    String systemPath=servletPath.split("/")[1];  //systemPath 就是gc
    String logicActionName=req.getParameter("logicName");  // logicActionName 就是HelloWorldAction
    String actionPath=getActionPath(systemPath, logicActionName);
    action=(Action) Class.forName(actionPath).newInstance();
    Map<String, Object> infoOut=action.doAction(infoIn);   

    private String getActionPath(String systemPath,String actionName){
        String actionPath="";
        if (systemPath!=null)
            actionPath="com."+systemPath+".action."+actionName;

        return actionPath;
    }

在上例中getActionPath返回的是com.gc.action.null。肯定报错ClassNotFound。

其实我们可以把getActionPath改成如下的样子:

private String getActionPath(String systemPath,String actionName){
        String actionPath="";
        if (actionName!=null) {
            actionPath="com."+systemPath+".action."+actionName;
        }else {
            actionPath="com.gd.action.GdAction";
        }
        return actionPath;
    }

在这个GdAction里我们放置一个默认的访问路径。

GdAction.java
    public HashMap<String, Object> doAction(HashMap<String, Object> infoIn) {
        String action = (infoIn.get("action") == null) ? "" : (String) infoIn
                .get("action");
        HashMap<String, Object> infoOut = new HashMap<String, Object>();
        if (action.equals(""))
            infoOut = this.doInit(infoIn);
        return infoOut;
    }

    /**
     * 该方法设置用户登录时页面的初始信息
     *
     * @param infoIn
     * @return HashMap
     */

    private HashMap<String, Object> doInit(HashMap<String, Object> infoIn) {
        HashMap<String, Object> infoOut = infoIn;

        infoOut.put("forwardJsp", "../../jsp/welcome");
        return infoOut;
    }
OK搞定。

我们的welcom.jsp内容很简单,就是一个欢迎页面嘛:

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>欢迎您使用gf的Web框架</title>
</head>

<body center>
<H1><font color='red'>
欢迎您使用gf的Web框架
</font>
</H1>
</body>
</html>

集腋成裘,聚沙成塔。慢慢来,在下一节,我们继续完善我们的框架。

自己动手写web框架----2的更多相关文章

  1. 自己动手写web框架----1

    本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...

  2. (新)自己动手写ORM框架(1)-增删查改的使用

    之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...

  3. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  4. 自己动手写Android框架-数据库框架

    大家在工作中基本上都有使用到数据库框架 关系型:ORMLite,GreenDao 对象型:DB4O,Perst 这些数据库用起来都非常的简单,对于我们Android上来说这些数据库足够我们使用了,但是 ...

  5. 自己动手做Web框架—MVC+Front Controller

    在我前面一篇博文<逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎>发表之后,很多人关心,脱离了之后怎么办?那么这可以说是它的续篇了. 同时,这也是eLiteWeb开源软件的一 ...

  6. 手写web框架之加载Controller,初始化框架

    1,加载Controller     我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:      通过ClassHelper我们可以获取所有定义了Controller注解的 ...

  7. 手写web框架之实现依赖注入功能

    我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...

  8. 自己动手写ORM框架

    提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数. 下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理. 功能描述 ...

  9. [置顶] 自己动手写Web容器之TomJetty之六:动态页面引入

    传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 2.让服务动起来 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数 在上一节,我们已经完成了TomJetty服 ...

随机推荐

  1. 初识Java多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别 ...

  2. [lua]写个简单的Lua拓展-sleep函数

    这几天在做一个小项目,其中用到了一些基本的API, 例如sleep,获取当前目录等等,lua标准库中没有提供这些接口,虽然所第三方库中也都有实现,但是要用的就那么几个函数,在一个嵌入式系统中安装那么多 ...

  3. 开源IMDG之GridGain

    作为另一款主流的开源数据网格产品,GridGain是Hazelcast的强有力竞争者.同样提供了社区版和商业版,近日GridGain的开源版本已经进入Apache孵化器项目Ignite(一款开源的内存 ...

  4. RocketMQ,JStorm与Tair使用笔记

    关于RocketMQ 启动mq nohup sh mqnamesrv -n 10.150.0.94:9876 &  nohup sh mqbroker -n 10.150.0.94:9876 ...

  5. ubuntu16.04主题美化和软件推荐

    前几天把ubuntu从15.10更新到了16.10,在网上看到有很多直接更新出问题的,正好赶上换SSD,于是采用全新安装,之前用ubuntu的时候装软件最让人头疼了,这回又得头疼一次了!! 索性把他记 ...

  6. (一二〇)CALayer的一些特性

    1.每个View都自带一个CALayer,称为rootLayer,layer可以和实现与View一样的显示功能,但是它不继承UIResponse,也就是说它无法处理事件,所以为了处理事件还是要用Vie ...

  7. 创建银行API

    DECLARE lc_output VARCHAR2(3000); lc_msg_dummy VARCHAR2(3000); lc_return_status VARCHAR2(3000); lc_m ...

  8. Cocos2D添加精灵纹理滤镜实现图像复古效果的转换

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 大家知道Cocos2d本身是一个非常强悍的2d游戏引擎,其中自 ...

  9. 【一天一道LeetCode】#371. Sum of Two Integers

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Calcula ...

  10. 华为解锁BL

    华为手机要怎么查看手机是否需要解锁呢?相信许多机油都不懂自己入手的手机是否需要解锁.而华为手机自华为C8812之后的高通手机均需要先解锁才能够尽兴刷机或获取Root权限的.那么下面我给大家分享一下华为 ...