jsp+servlet+javabean实现ssh的mvc模式
干了很久的项目都是使用SSH框架的,现在团队有位搞美工的美女突然想要搞java了,让我做下指导并打个基本的框架,需要使用最基本的架构,这样说来那SSH只能滚得远远的了;
最基本的架构也就jsp+servlet+javabean,但心里感觉还是不爽,搞这个不是纯属浪费时间啊。后来一想,对了我自己可以不用框架来设计出一个简单的mvc架构来实现框架带来的分层效果:
这里我就以登录为例子来讲解下,讲解的顺序为v--->c---->m
页面端:login.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>
<head>
<title>amdinLogin.html</title>
</head>
<body>
<form action="../AdminLogin.action" method="post">
<input type = "text" name = "username"/>
<input type = "password" name = "password"/>
<input type = "submit" name = "login" value = "注册"/>
</form>
</body></html>
配置文件web.xml
<servlet>
<servlet-name>controlServlet</servlet-name>
<servlet-class>xidian.sl.equipment.Servlet.ControlServlet</servlet-class><!-- 这里的配置与一般的servlet一样,但由于整个项目只会有一个servlet,所有的访问都将访问这个servlet,因此不同的访问只需要添加下面的参数即可-->
<init-param>
<!-- 页面请求的地址-->
<param-name>AdminLogin</param-name>
<!-- 处理action的后台Action地址-->
<param-value>xidian.sl.equipment.action.LoginAction</param-value>
</init-param>
<init-param>
<param-name>picListAction</param-name>
<param-value>xidian.sl.equipment.action.PicListAction</param-value>
</init-param>
<init-param>
<param-name>newListAction</param-name>
<param-value>xidian.sl.equipment.action.NewListAction</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>controlServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
充当控制层的servlet:xidian.sl.equipment.Servlet.ControlServlet(很重要)
package xidian.sl.equipment.Servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import xidian.sl.equipment.action.interfaces.Action;import xidian.sl.equipment.actionfactory.ActionFactory;public class ControlServlet extends HttpServlet{ /**
* 任何请求都会到这个servlet中,这个servlet就是充当MVC模式中的C(控制层) */
private static final long serialVersionUID = 1L;
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /**
* 得到当前Servlet的请求路径
* */
String pathName = request.getServletPath(); //System.out.println("pathName:"+pathName);
/**
* 得到请求的Action名字
* */
int index = pathName.indexOf(".");
String ActionName = pathName.substring(1, index);
//System.out.println(ActionName);
/**
* 获取运行时参数
* */
String ActionClassName = this.getInitParameter(ActionName);
//System.out.println("actionclassName "+ ActionClassName);
/**
* 得到Action对象
* */
Action action = ActionFactory.getActionFactory().getAction(ActionClassName);
//System.out.println("action "+action);
/**
* 执行Action的execute得到要返回的URL路径
* */
String url = action.execute(request, response);
if(url == null){
request.getRequestDispatcher("error.jsp").forward(request, response);
}else{
request.getRequestDispatcher(url).forward(request, response);
}
}
}
Action:面向接口编程,提供一个统一的Action接口,里面就一个方法execute();模拟struts1.x
package xidian.sl.equipment.action.interfaces;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public interface Action { /**
* 所有的具体Action实现这个接口
* @param request 请求对象
* @param response 应答对象
* @return :结果页面
*/
public String execute(HttpServletRequest request, HttpServletResponse response);
}
LoginAction:
package xidian.sl.equipment.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import xidian.sl.equipment.action.interfaces.Action;import xidian.sl.equipment.dao.impl.AdminDAOImpl;import xidian.sl.equipment.dao.interfaces.AdminDAO;public class LoginAction implements Action {
@Override public String execute(HttpServletRequest request,
HttpServletResponse response) { /**
* 从request中得到相应的值
* */
String username = request.getParameter("username");
String password = request.getParameter("password"); /**
* 实例化DAO层,但其实这样做还是不完美的,最好自己写一个依赖注入的类
* */
AdminDAO adminDAO = new AdminDAOImpl(); /**
* 返回查找后的二维数组
* */
String[][] data = adminDAO.findAdmin(username, password); if(data == null|| (data != null&& data.length == 0)){ //数组为空,表示无此账号存在
return "admin/login.html";
} else {
return "admin/index.html";
}
}
}
在实现类LoginAction中实例化了AdminDAO进行持久化操作,这里为了方便起见是直接使用new进行实例化,但这样硬编码带来耦合,如需要改进可以参考模拟spring的ioc
http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494412.html 讨论简单工厂模式时有简单的实现,大家可以进行改进使其更加完美
AdminDAO:
package xidian.sl.equipment.dao.interfaces;public interface AdminDAO { /**
* 根据用户名与密码来查找相应用户
* */
public String[][] findAdmin(String username, String password);
}
AdminDAOImpl:
package xidian.sl.equipment.dao.impl;import xidian.sl.equipment.dao.interfaces.AdminDAO;import xidian.sl.equipment.util.DbConn;public class AdminDAOImpl implements AdminDAO{
@Override public String[][] findAdmin(String username, String password) {
String sql = "select * from admin as ad where ad.aId = '"+username+"' and ad.aPassword = '"+password+"'";
String[][] data = DbConn.query(sql); return data;
}
}
该实现类中使用了已封装好的数据库操作类,详细见:http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494874.html
数据库的设计比较简单:只需要主键id, 用户账号:username, 账号密码:password
这样就基本实现了mvc的效果,你还可以根据项目的复杂程度向DAO与Action之间再插入一层Service