自定义MVC框架(一)-(没有基于xml的)
0.创建oracle的sql语句如下
--创建表
create table userinfo(id number primary key,uname varchar2(20),password varchar2(20),age number);
--创建序列
create sequence seq_userinfo;
--添加数据
insert into userinfo values(seq_userinfo.nextval,'holly','123',18);
insert into userinfo values(seq_userinfo.nextval,'石头','123',18);
insert into userinfo values(seq_userinfo.nextval,'朱亚楠','123',18);
--提交事务
commit;
1.创建如下项目结构
2.在com.entity包下创建实体类UserInfo.java
package com.entity;
/**
* 用户信息表
* @author Holly老师
*
*/
public class UserInfo {
private Integer id;
private String uname;
private String password;
private Integer age; public UserInfo(Integer id, String uname, String password, Integer age) {
this.id = id;
this.uname = uname;
this.password = password;
this.age = age;
} public UserInfo() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} }
UserInfo.java
3.在com.dao包下创建操作数据库的BaseDao.java
package com.dao; import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 链接数据库工具类
* @author Holly老师
*
*/
public class BaseDao{
//1. 定义连接所需要的字符串
private static final String DRIVER="oracle.jdbc.driver.OracleDriver";
private static final String URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private static final String USER="holly";
private static final String PASSWORD="sys"; public static Connection conn=null;
public static PreparedStatement pstm=null;
public static ResultSet rs=null; static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public Connection getConnection(){
try {
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} public ResultSet executeQuery(String sql,Object[] param){
conn=this.getConnection();
try {
pstm=conn.prepareStatement(sql);
if(param!=null){
for (int i = 0; i < param.length; i++) {
pstm.setObject(i+1, param[i]);
}
}
rs=pstm.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
} public void closeAll(ResultSet rs,PreparedStatement pstm,Connection conn){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(pstm!=null){
pstm.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} }
BaseDao.java
4.在com.dao包下创建UserInfoDao.java接口
package com.dao; import com.entity.UserInfo;
/**
* 增删改接口
* @author Holly老师
*
*/
public interface UserInfoDao {
public UserInfo getUserByNamePwd(String name,String pwd);
}
UserInfoDao.java
5.在com.dao.impl包下创建接口的实现类UserInfoDaoImpl.java
package com.dao.impl; import java.sql.SQLException; import com.dao.BaseDao;
import com.dao.UserInfoDao;
import com.entity.UserInfo;
/**
* 增删改接口实现类
* @author Holly老师
*
*/
public class UserInfoDaoImpl extends BaseDao implements UserInfoDao { public UserInfo getUserByNamePwd(String name, String pwd) {
UserInfo user=null;
String sql="select * from userinfo where uname=? and password=?";
Object[] param={name,pwd};
rs=this.executeQuery(sql, param);
try {
if(rs.next()){
user=new UserInfo(rs.getInt("id"), rs.getString("uname"), rs.getString("password"), rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
this.closeAll(rs, pstm, conn);
}
return user;
} }
UserInfoDaoImpl.java
6.在com.service包下创建业务接口UserInfoService.java
package com.service; import com.entity.UserInfo;
/**
* 服务接口
* @author Dell
*
*/
public interface UserInfoService{
public UserInfo login(String name,String pwd);
}
UserInfoService.java
7.在com.service.impl包下创建业务接口实现类UserInfoServiceImpl.java
package com.service.impl; import com.dao.UserInfoDao;
import com.dao.impl.UserInfoDaoImpl;
import com.entity.UserInfo;
import com.service.UserInfoService;
/**
* 服务实现类
* @author Holly老师
*
*/
public class UserInfoServiceImpl implements UserInfoService{ public UserInfo login(String name, String pwd) {
UserInfoDao dao=new UserInfoDaoImpl();
return dao.getUserByNamePwd(name, pwd);
} }
UserInfoServiceImpl.java
8.在com.action包下创建Action.java接口
package com.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 1.定义主控制器,用于分发请求
* @author Holly老师
*
*/
public interface Action {
/**
* 用于分发拦截的请求
* @param request 请 求
* @param response 响应
* @return 执行完操作要跳转的页面,“success”跳转到成功页面,“fail”跳转到失败页面
*/
public String execute(HttpServletRequest request,HttpServletResponse response); }
Action.java
9.在com.action包下创建LoginAction.java实现类
package com.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.entity.UserInfo;
import com.service.UserInfoService;
import com.service.impl.UserInfoServiceImpl;
/**
* 2.每个action表示用户请求的一个操作
* 该Action控制登录
* @author holly老师
*
*/
public class LoginAction implements Action {
/**
* 控制页面跳转的方法
* request获取页面输入,然后调用业务方法得到结果 ,
* 如果登录失败则将结果保存到request对象中,
* 如果登录成功,将用户信息保存到session中
*/
public String execute(HttpServletRequest request,
HttpServletResponse response) {
//1.获得页面请求参数
String username=request.getParameter("username");
System.out.println("username"+username);
String password=request.getParameter("password");
System.out.println("password"+password); //2.业务处理
UserInfoService userservice=new UserInfoServiceImpl();
UserInfo userinfo=userservice.login(username, password); if(userinfo==null){
System.out.println("没查到");
request.setAttribute("message", "用户名或密码错误");
return "/page/login.jsp";
}else{
System.out.println("查到了");
request.getSession().setAttribute("login",userinfo );
return "/page/show.jsp"; }
} }
LoginAction.java
10.在com.filter包下创建ActionFilter.java核心过滤器类
package com.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.action.Action;
import com.action.LoginAction;
/**
* 核心控制器=过滤器
* 在处理每次请求时首先根据请求路径找到将要被执行后的Action,然后调用Action的execute方法,
* 根据execute方法返回的转发路径转发到对应的JSP页面
* @author Holly老师
*
*/
public class ActionFilter implements Filter {
//定义接受过滤器节点里param的参数
private String encode = null; //定义过滤器参数变量
private FilterConfig config;
/**
* 销毁
*/
public void destroy() {
encode = null;
}
/**
* 初始化
*/
public void init(FilterConfig config) throws ServletException {
//接受web.xml文件中配置的参数
String encode = config.getInitParameter("encode");
if (this.encode == null) {
this.encode = encode;
} }
/**
* 请求处理
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException { //乱码处理
if (null == request.getCharacterEncoding()) {
request.setCharacterEncoding(encode);
} //1.将请求转换成HtpServlet请求
HttpServletRequest hsr=(HttpServletRequest) request;
HttpServletResponse hsp= (HttpServletResponse) response; //2.获得Action
//Action action=new LoginAction();
Action action=this.getAction(hsr); //3.调用Action的execute方法
//定义接受Action中execute方法返回值的变量
String resultView=null;
try {
//得到某个action请求的页面地址
resultView=action.execute(hsr,hsp);
} catch (Exception e) {
e.printStackTrace();
} //4.页面跳转
if(null!=resultView){
//请求下发
request.getRequestDispatcher(resultView).forward(request, response);
} }
/**
* 获取请求中的Action
* @param hsr
* @return
*
*/
private Action getAction(HttpServletRequest request) {
//1.获取请求中的uri:项目名/Xxx.action
//Stuts2_Part1__C1_MyMVC/login.action
String uri=request.getRequestURI();
System.out.println("uri:"+uri); //2.获取上下文路径:项目名
//Stuts2_Part1__C1_MyMVC/
String contextPath=request.getContextPath();
System.out.println("contextPath:"+contextPath); //3.获取Xxx.action,从某个位置截取到最后
String actionPath=uri.substring(contextPath.length());
System.out.println("actionPath:"+actionPath); //4.获取Action的名字:Xxx
String actionName=actionPath.substring(1,actionPath.lastIndexOf('.')).trim();
System.out.println("actionName:"+actionName); //5.获取某个Action类对象
Action action=null;
if("login".equals(actionName)){
action=new LoginAction();
}
//返回拦截的某个action对象
return action;
} }
ActionFilter.java
11.编辑WebRoot先的WEB-INF下的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>page/login.jsp</welcome-file>
</welcome-file-list> <!-- 以.action结束的请求都会派发到ActionFilter中进行过滤 -->
<filter>
<filter-name>requestFilter</filter-name>
<filter-class>com.filter.ActionFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> </web-app>
web.xml
12.在WebRoot下创建page文件夹,并创建login.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<fieldset style="width:400px; height=400px;">
<legend>登录</legend>
<form action="login.action">
<table>
<tr><td>用户名:</td><td><input type="text" id="username" name="username"/></td></tr>
<tr><td>密 码:</td><td><input type="password" id="password" name="password"/></td></tr>
<tr><td><input type="submit" value="登录"/></td><td><input type="reset" value="重置"/></td></tr>
</table>
</form>
</fieldset>
</body>
</html>
login.jsp
13.在WebRoot下创建page文件夹,并创建show.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
登录成功!欢迎来到首页
</body>
</html>
show.jsp
14.可以运行了!
中文用户名登录
自定义MVC框架(一)-(没有基于xml的)的更多相关文章
- 自定义MVC框架
我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...
- Struts2 自定义MVC框架
一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...
- 第一章 自定义MVC框架
第一章 自定义MVC框架1.1 MVC模式设计 组成:Model:模型,用于数据和业务的处理 View :视图,用于数据的显示 Controller:控制器 ...
- Java Web自定义MVC框架详解 (转)
转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...
- MVC框架浅析(基于PHP)
MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...
- 自定义MVC框架之工具类-模型类
截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...
- 自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...
- 自定义MVC框架之工具类-文件上传类
截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...
- struts2自定义MVC框架
自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...
- 使用Intellij Idea自定义MVC框架
---恢复内容开始--- 今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图 ...
随机推荐
- InnoDB与MyISAM引擎区别
mysql中InnoDB与MyISAM两种数据库引擎的区别: 一.InnoDB引擎: 1.支持事务性, 2.支持外部键, 3.行级锁, 4.不保存表的具体行数,执行select count(*) fr ...
- 摘抄来自论坛的一些DDD讨论
先说说之前几次DDD项目失败的案例,其实也不能算是失败,只是没有领会DDD的思想. 之前的DDD是建立在数据层之上的,首先是每张数据表对应一个数据实体,每个数据实体由泛型的DAO管理,DAO又被数据上 ...
- CodeForces 687B Remainders Game
数论. 如果$x$不唯一,假设存在两个解,较大的为${x_1}$,较小的为${x_2}$. 那么, $\left\{ {\begin{array}{*{20}{c}}{{x_1}\% {c_i} = ...
- Mac OS启动服务优化高级篇(launchd tuning)
Mac下的启动服务主要有三个地方可配置:1,系统偏好设置->帐户->登陆项2,/System/Library/StartupItems 和 /Library/StartupItems/3, ...
- 【3】JavaScript编程全解笔记(三)
减少重复劳动,抓住核心. 第 4 部分 HTML5 1. HTML 技术分类 与 API 2. ApplicationCache 缓存 第 15 章 与桌面应用的协作 第 17 章 WebSocket ...
- [kuangbin带你飞]专题六 最小生成树 POJ 1287 Networking
最小生成树模板题 跑一次kruskal就可以了 /* *********************************************** Author :Sun Yuefeng Creat ...
- Opencv2.2版本以上CvvImage类的使用
Opencv 2.2以上的版本不再包含CvvImage类,可有时我们在MFC中显示图片仍然需要CvvImage类,特别进行图像的拷贝.显示等操作的时候. 早期版本的CvvImage.h添加进工程也是可 ...
- JS中千分位的处理
function commafy(num) { //1.先去除空格,判断是否空值和非数 num = num + ""; num = num.replace(/[ ]/g, &quo ...
- Linux 网络性能tuning向导
本文的目的不完全在于提供调优信息,而是在于告诉读者了解Linux kernel如何处理数据包,从而能够在 自己的实践中发挥Linux 内核协议栈最大的性能 The NIC ring buffer 接收 ...
- 浅谈C#委托和事件
委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...