自己动手写web框架----2
在上一节,我们自己写的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的更多相关文章
- 自己动手写web框架----1
本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...
- (新)自己动手写ORM框架(1)-增删查改的使用
之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- 自己动手写Android框架-数据库框架
大家在工作中基本上都有使用到数据库框架 关系型:ORMLite,GreenDao 对象型:DB4O,Perst 这些数据库用起来都非常的简单,对于我们Android上来说这些数据库足够我们使用了,但是 ...
- 自己动手做Web框架—MVC+Front Controller
在我前面一篇博文<逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎>发表之后,很多人关心,脱离了之后怎么办?那么这可以说是它的续篇了. 同时,这也是eLiteWeb开源软件的一 ...
- 手写web框架之加载Controller,初始化框架
1,加载Controller 我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑: 通过ClassHelper我们可以获取所有定义了Controller注解的 ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- 自己动手写ORM框架
提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数. 下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理. 功能描述 ...
- [置顶] 自己动手写Web容器之TomJetty之六:动态页面引入
传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 2.让服务动起来 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数 在上一节,我们已经完成了TomJetty服 ...
随机推荐
- android注解入门 并来自己写一个框架
介绍 这里我带大家来学习一下注解 并且用来写下一个模仿xUtils3 中View框架 此框架 可以省略activity或者fragment的 findViewById 或者设置点击事件的烦恼 我正参加 ...
- 弹出层之2:JQuery.BlockUI
JQuery.BlockUI是众多JQuery插件弹出层中的一个,它小巧(原版16k,压缩后10左右),容易使用, 功能齐全,支持Iframe,支持Modal,可定制性高也意味他默认谦虚的外表. jQ ...
- mysql5.7在centos上安装的完整教程以及相关的“坑”
安装前的准备 Step1: 如果你系统已经有mysql,如一般centos自带mysql5.1系列,那么你需要删除它,先检查一下系统是否自带mysql yum list installed | gre ...
- android NDK的下载-文件太大
需要FQ,建议使用VPN,下载前准备点时间配置网络环境.我的百度网盘好像有~~不过忘记地址了,改天共享,或者私聊我. 2015.4 Android 5.1 Android Studio https:/ ...
- Hive-ORC文件存储格式(续)
本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式. 一.表结构 库名+表名:fileformat.test_orc 字段 类型 category_ ...
- 反射模拟DbUtils实现ResultSet转成Bean实例
前几天接触到了apache的一个小框架DbUtils,真的被其优雅的设计所震撼到了,尤其是其中的 MyBean mybean = QueryRunner.query(sqlConnection,sql ...
- iOS开发之自己封装的提示框(警告框)样式BHAlertView
最近需要使用到提示框(警告框)进行信息的展示和提醒,所以进行了一个类的封装,想用Swift调用此OC文件,但是发现有些困难,所以暂时先把OC代码进行展示,随后再好好研究一下在Swift中的使用. 对于 ...
- Android ColorMatrix类图像颜色处理-黑白老照片、泛黄旧照片、高对比度等效果
在Android中,对图像进行颜色方面的处理,如黑白老照片.泛黄旧照片.高对比度.低饱和度等效果,都可以通过使用颜色矩阵(ColorMatrix)来实现. 1.颜色矩阵(ColorMatrix)介绍 ...
- 利用cocos2d-x实现CandyCrushSaga消除功能
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=455 昨天没事写了个三消玩玩.已 ...
- SSH深度历险(七) 剖析SSH核心原理(一)
接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问 ...