JSP应用的自我理解之5:MVC设计模式的具体实现

接着上一篇的博客:《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基础与案例开放详解》,清华大学出版社

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值