接着上一篇的博客:《JSP应用的自我理解之4:JSP+JavaBean设计模式的具体实现》说说,开始JSP模型2的具体实现。。。
模型2(MVC)体系结构集成使用了Servlet和JSP页面,这种模式将数据呈现模式与数据处理方式分离,提高了代码的利用率,是目前主流的开发模式之一
说白了,就是你把这数据处理模块扒过来改改名称,就可以直接用了,什么提交、判定、连接数据库之类统统给你搞定,技术民工必备手册~~
这是MVC体系的结构图:
来个实例吧,还是上一篇博客的实现,结果在客户端看来是一样的,但服务器端发生了变化,将数据显示与数据处理分离开,省多少事哦~~
上一张表,将该工程下的文件说明清楚~~
我的工程目录的实际分布如下图所示:
然后开始具体实现吧,骚年~~
1、新建一个jsp_mvc工程,在该工程下完成登录页面login.html,登录错误页面loginerr.jsp,登录成功页面welcome.jsp
login.html的具体代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form method="post" action="controller">
<input type="hidden" name="action" value="login">
用户名:<input type="text" name="name"><br>
密 码:<input type="password" name="password"><p>
<input type="reset" value="重填">
<input type="submit" value="登录">
</form>
</body>
</html>
loginerr.jsp的具体代买如下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
用户名或密码错误,请<a href="login.html">重新登录</a>
</body>
</html
welcome.jsp的具体代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="user" scope="session" class="bean.UserBean"></jsp:useBean>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
欢迎你,<jsp:getProperty name="user" property="name"/>!
</body>
</html>
2、在src下新建一个Bean包,在包下分别建立用户名类UserBean和UserCheckBean的java类
UserBean的具体代码如下:
package bean;
public class UserBean {
private String name;
private String password;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password=password;
}
}
UserCheckBean的代码如下:
package bean;
public class UserCheckBean {
protected UserBean user;
public UserCheckBean()
{
}
public UserCheckBean(UserBean user)
{
this.user=user;
}
public UserBean getUser()
{
return user;
}
public void setUser(UserBean user)
{
this.user=user;
}
public boolean validate()
{
String name=user.getName();
String password=user.getPassword();
//实际应用中,你应该查询数据库,验证用户名和密码。
if("ChiHuoChen".equals(name) && "1234".equals(password))
{
return true;
}
else
{
return false;
}
}
}
3、在Bean包下新建一个ControllerServlet的Servlet类,关于Servlet类的描述,参见我的另一篇博客:《Servlet技术的自我理解之三:Servlet运行原理及Servlet的加载实例化》
ControllerServlet的具体代码如下:
package bean;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
public class ControllerServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
{
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
String action=request.getParameter("action");
if (!isValidated(request) && !("login".equals(action)))
{
gotoPage("login.html",request,response);
return;
}
if("login".equals(action))
{
UserBean user=new UserBean();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
UserCheckBean uc = new UserCheckBean(user);
if(uc.validate())
{
HttpSession session = request.getSession();
//将user对象保存到Session对象中,在welcome.jsp中通过
//<jsp:useBean>动作元素从Session中得到user对象。
session.setAttribute("user",user);
//验证成功,将请求转向welcome.jsp。
gotoPage("welcome.jsp", request, response);
}
else
{
//验证失败,将请求转向loginerr.jsp。
gotoPage("loginerr.jsp", request, response);
}
}
//对于其它的action请求,可在后面的else if...else语句中继续处理。
/*else if
{
}
else
{
}*/
}
/**
* 判断用户是否已经登录了。
*/
private boolean isValidated(HttpServletRequest request)
{
HttpSession session = request.getSession();
if (session.getAttribute("user") != null)
return true;
else
return false;
}
/**
* 将请求导向指定的页面。
*/
private void gotoPage(String targetURL, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
RequestDispatcher rd;
rd=request.getRequestDispatcher(targetURL);
rd.forward(request, response);
}
}
4、不要忘记配置web.xml文件,在WEB-INF下新建一个web.xml文件,在头文件中要加入一段代码,可以参见我的另一篇博客:《JSP应用的自我理解之二:JSP的异常处理机制及具体实现》
具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>bean.ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/controller</url-pattern>
</servlet-mapping>
</web-app>
最后,你可以跑一跑你的login.html文件了,看到这个时,你差不多就成了~~
顺带备注下,看看你的web.xml配置路径,会有点小收获哦~~
写在最后:令人比较沮丧的是,目前还暂时没解决中文字符传递中出错的问题,不知道是哪个环节具体出错,当我输入"吃货陈"时,一直进入的就是出错界面,让人比较心酸,这是一个大问题,暂时先这样吧,先把这MVC的设计模式搞透,然后以后有空在解决中文字符的问题,草莽了点~~~
参考文献:《JSP基础与案例开放详解》,清华大学出版社