`

用户登录系统的演变之MVC模式

 
阅读更多

在前面的版本中,jsp中嵌套着java代码,或者调用java 类和方法

显得非常奇怪,层次不够清晰,接下来我们要用mvc模式来完善和优化次系统

Model : java class /java bean/ejb

View: jsp

Controller:Servlet

1,login.jsp

	<body>
		<center><h1>登陆界面</h1>
		<hr>
		<form action="LoginServlet" method="post">
			用户名:
			<input type="text" name="id" />
			<br>
			密&nbsp;&nbsp;码:
			<input type="password" name="passw" />
			<br>
			<input type="submit" value="提交" />
			<input type="reset" value="重置" />
			<hr>
		</form>
		</center>
	</body>
</html>

 

2,LoginServlet.java
package com.dtg.controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dtg.model.User;
import com.dtg.model.UserCl;

public class LoginServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * 把loginCl.jsp 页面实现的操作,转移到它本应该所在的位置上,就是控制器Servlet
		 * 
		 */
		String id = request.getParameter("id");
		String passw = request.getParameter("passw");
		System.out.println("这是Servlet控制器!!!非常牛逼");
		int pageNow = 1;//当前页
//		int pageSize = 3;//页大小
		int pageCount = 0;//页数
//		int rowCount = 0;//总记录数
		UserCl userCl = new UserCl();
		if (userCl.checkUser(id, passw)) {
			// 用户合法
			/**
			 * sendRedirect “转向” 效率不过,很多软件公司都不适用这个方法,而是使用转发
			 */
			// response.sendRedirect("login_success.jsp");
			
			/**
			 * 在跳转到login_succss.jsp 之前,先把数据准备好 
			 */
			ArrayList<User> al = userCl.getUserByPage(pageNow);
			pageCount = userCl.getPageCount();
//			将al和pageCount,pageNow放入request中
			request.setAttribute("result", al);
			request.setAttribute("pageCount", pageCount+"");
			request.setAttribute("pageNow", "1");
			
			request.getRequestDispatcher("login_success.jsp").forward(request,
					response);
		} else {
//			 用户不合法
			request.getRequestDispatcher("login_failure.jsp").forward(request,
					response);
		}

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * 合二为一
		 * post方法或者get方法都能搞定
		 */
		this.doGet(request, response);

	}

}
 3,login_success.jsp
	<body>
		<center>
			<h1> 
				登陆成功 
			</h1>
			<h2>
				欢迎
				<font color="red"><%=request.getParameter("user")%></font>光临
			</h2>
			<a href="/jsp1/index.jsp">返回重新登录</a>
			<hr>
			<%
				//接受用户想要显示的页面
				String s_pageNow = (String)request.getAttribute("pageNow");
				
				int pageNow = Integer.parseInt(s_pageNow);
			
				//要显示的数据,用request来取
				ArrayList<User> al = (ArrayList<User>)request.getAttribute("result");
				
				//	object -->String -->int
				
				String s_pageCount = (String)request.getAttribute("pageCount");
				int pageCount = Integer.parseInt(s_pageCount);
				
				//用表格显示
				%>
					<table border="1">
							<tr><td>userId</td><td>ID</td><td>PASSWORD</td><td>AGE</td><td>SEX</td></tr>
							<%
								for(int i=0;i<al.size();i++){
									User user = (User)al.get(i);
									%>
										<tr><td><%=user.getUserId() %></td><td><%=user.getId() %></td>
										<td><%=user.getPassword() %></td>
										<td><%=user.getAge() %></td><td><%=user.getSex() %></td></tr>
									<%
								}
							 %>
						</table>
				<%
				//显示超链接
				if(pageNow != 1){
						out.print("<a href=UserServlet?pageNow="+(pageNow-1)+" >上一页</a>");
					}
				
				if(pageNow > 6 && pageNow <= (pageCount-4)){
					for(int i=pageNow-5;i<=pageNow+4;i++){
						out.println("<a href=UserServlet?pageNow="+i+">["+i+"]</a>");
					}
				}else if(pageNow >(pageCount-4) ){
					for(int i=pageCount-9;i<=pageCount;i++){
						out.println("<a href=UserServlet?pageNow="+i+">["+i+"]</a>");
					}
				}else{
					for(int i=1;i<=10;i++){
				//要是pageCount > 10  则不显示全部,只显示前10页的超链接
				//for(int i=1;i<=pageCount;i++)
					out.println("<a href=UserServlet?pageNow="+i+">["+i+"]</a>");
					}
				}
				
				if(pageNow != pageCount){
					out.print("<a href=UserServlet?pageNow="+(pageNow+1)+">下一页</a>");
				}
				
			%>
		</center>

	</body>
</html>
 4,UserServlet.java
package com.dtg.controller;
/*
 * 这个控制器,控制分页,增删改查等功能
 * */
import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dtg.model.User;
import com.dtg.model.UserCl;

public class UserServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 得到用户希望显示的pageNow
		 * */
		System.out.println("分页也用的是servlet控制器");
		String s_pageNow = request.getParameter("pageNow"); //从login_success.jsp传过来
		try {
			int pageNow = Integer.parseInt(s_pageNow);
			UserCl userCl = new UserCl();
			ArrayList<User> al =  userCl.getUserByPage(pageNow);
			int pageCount = userCl.getPageCount();
			request.setAttribute("result", al);
			request.setAttribute("pageCount", pageCount+"");
			request.setAttribute("pageNow", pageNow+"");
			
			request.getRequestDispatcher("login_success.jsp").forward(request,
					response);
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		this.doGet(request, response);

	}

}
 5,UserCl.java
package com.dtg.model;
 
import java.sql.*;
import java.util.ArrayList;
public class UserCl {
	
	Connection conn = null;
	Statement sm = null;
	ResultSet rs = null;
	boolean flag = false;
	
	int pageSize = 3; // 页面大小
	int pageNow = 1;//默认显示第一页
	int rowCount = 0;//总记录数,从数据库中查询
	int pageCount = 0; //页数,(rowCount/pageSize)+1
	
	//关闭连接
	public void closeConn() throws SQLException{
		try {
			if(rs != null){
				rs.close();
				rs = null;
			}
			if(sm!=null){
				sm.close();
				sm = null;
			}
			if(conn!=null){
				conn.close();
				conn = null;
			}
		} catch (Exception e) {
			
			e.printStackTrace();
			// TODO: handle exception
		}
		
	}
	public boolean checkUser(String id, String passw){
		
		try {
			
			ConnDB conndb =new ConnDB();
			conn = conndb.getConn();
			sm = conn.createStatement();
	    	rs = sm
	    			.executeQuery("select password from user2 where id ='" + id
	    					+ "'");
	    	if (rs.next()) {
	    		//确保用户名id是存在的
	    		if (rs.getString(1).equals(passw)) {
	    			//密码正确,用户合法
	    			flag = true;
	    		} else {
	    			//密码不正确,用户不合法
	    			flag = false;
	    		}
	    	} else {
	    		//用户不存在
	    		flag = false;
	    	}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			try {
				this.closeConn();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return flag;
	}
	
	/**
	 * 得到分页的页数
	 * @return
	 */
	public int getPageCount(){
		try {
			conn = new ConnDB().getConn();
			sm = conn.createStatement();
			rs = sm.executeQuery("select count(*) from user2");
			if (rs.next()) {
				rowCount = rs.getInt(1);
			}

			// 计算pageCount
			if (rowCount % pageSize == 0) {
				pageCount = rowCount / pageSize;
			} else {
				pageCount = rowCount / pageSize + 1;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			try {
				this.closeConn();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return pageCount;
	}
	
	/**
	 * 取要分页显示的数据
	 */
	public ArrayList<User> getUserByPage(int pageNow){
		ArrayList<User> al =  new ArrayList<User>();
		try {
			conn = new ConnDB().getConn();
			sm = conn.createStatement();
			rs = sm.executeQuery("select top "+ pageSize+ " * from user2 where userId not in (select top "+ pageSize*(pageNow-1)+" userId from user2 order by userId) order by userId");
			while(rs.next()){
				User user = new User();
				user.setUserId(rs.getInt(1));
				user.setId(rs.getString(2));
				user.setPassword(rs.getString(3));
				user.setAge(rs.getInt(4));
				user.setSex(rs.getString(5));
				
				//添加user到动态数组中
				al.add(user);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			try {
				this.closeConn();
			} catch (Exception e2) {
				e2.printStackTrace();
				// TODO: handle exception
			}
		}
		return al;
	}
}
 6,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">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.dtg.controller.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.dtg.controller.TestServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.dtg.controller.UserServlet</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/UserServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
 
分享到:
评论

相关推荐

    ASP.NET系统开发中MVC设计模式

    MVC模式旨在分离应用程序的业务逻辑、用户界面和数据管理。在三层架构中,模型代表数据访问层,负责数据处理和业务规则;视图则作为表示层,负责展示数据给用户;控制器是中间件,协调模型和视图之间的交互,处理...

    基于MVC设计模式构筑JSPServlet+EJB的Web应用

    在这个案例中,作者展示了如何使用MVC模式结合JSP/Servlet+EJB技术来开发这样一个系统。具体来说,他们是如何将各个部分有效地整合在一起,以实现系统的功能需求,并确保良好的性能和可扩展性。 #### 结论 综上所...

    个人博客系统(Spring+Spring MVC+MyBatis )

    当用户访问博客系统的某一个页面时,Spring MVC会根据用户的请求找到合适的控制器(Controller),控制器中的方法会被调用,并返回一个模型(Model)和一个视图(View)。模型通常包含了业务数据,视图则负责展示...

    struts mvc 介绍

    Struts MVC是Apache软件基金会下的一个开源框架,专门针对Java Web应用,提供了实现MVC模式的一种工具集。 1. **什么是MVC模式?** MVC模式是一种软件设计模式,将应用程序分为三个核心组件:Model(模型)、View...

    mvc设计思想

    #### 四、MVC模式的演变 1. **JSP Model 1**:这是一种较早的Web应用开发方式,其中JSP页面既处理用户的请求又负责渲染视图。这种方式简单,但随着应用规模的扩大,会导致代码混乱和维护困难等问题。 2. **JSP ...

    mvc网格助手,具有分页、搜索、排序、过滤等功能。此mvc助手基于 JTable 构建.zip

    随着互联网技术的不断发展,MVC模式也在不断地演变和优化,衍生出很多新的架构模式。 该标题中提到的MVC网格助手,具有分页、搜索、排序、过滤等功能,意味着这个工具或组件为开发者提供了丰富的数据展示和交互功能...

    springMVC开发手册

    - 说明了MVC模式通过分离数据访问、业务处理和界面展示,提高软件工程的可维护性与可测试性。 - 讨论了观察者设计模式在MVC中的应用,即模型可以主动向视图推送更新。 3. WebMVC概述: - 讨论了Web环境下MVC的...

    ASP.NET MVC正式版1.0 简单例子

    1. **MVC模式**:Model代表应用程序的数据模型,负责管理和存储数据;View负责显示数据,提供用户界面;Controller处理用户输入,协调Model和View之间的交互。这种分层架构使得代码组织更加清晰,有利于团队协作和...

    System.Web.Mvc.dll 1.0-5.0各种版本

    《System.Web.Mvc.dll:从1.0到5.0的演变与应用》 在.NET框架中,`System.Web.Mvc.dll`扮演着至关重要的角色,它是ASP.NET MVC(Model-View-Controller)框架的核心组件,为Web应用程序开发提供了强大的支持。自...

    毕业论文-文献翻译

    - **21世纪初至今**:随着互联网技术的发展,MVC模式成为了Web开发的标准模式之一。许多流行的框架,如Ruby on Rails、Spring MVC等,都采用了MVC模式。 #### MVC 模式的优势 - **清晰的分离关注点**:MVC模式将...

    电子商务,mvc,开题报告

    在开题报告中,你可以深入探讨如何在电子商务系统中应用MVC架构,包括如何设计模型来处理商品、订单、用户等核心业务对象,如何构建控制器来处理用户的购物操作,以及如何优化视图以提供用户友好的界面。 总结,...

    MVCMVC架构模式

    1. **分离关注点**:MVC模式将应用程序的不同部分分离,使开发者可以专注于各自领域的开发,提高工作效率。 2. **可测试性**:由于各部分职责明确,可以独立进行单元测试,提高软件质量。 3. **易于维护**:修改一个...

    J2ee设计模式.pdf

    视图-控制器(MVC)模式是应用最为广泛的设计模式之一,它将应用分为三个主要部分:模型(Model)负责数据和业务逻辑,视图(View)负责显示数据,控制器(Controller)负责接收输入并调用模型和视图去完成用户的...

    精通Struts-基于MVC的Java Web设计与开发

    1. **MVC架构**:MVC模式是一种软件设计模式,将业务逻辑(Model)、用户界面(View)和控制逻辑(Controller)分离,使得开发者可以独立地修改各个部分,提高了代码的可复用性和可维护性。在Struts中,Model负责...

    mvc1-3的安装包

    1. **模型-视图-控制器架构**:MVC 1.0引入了这一经典设计模式,将业务逻辑(模型)、用户界面(视图)和应用程序控制流(控制器)分离,使得代码更加模块化。 2. **路由系统**:MVC 1.0的路由引擎允许开发人员...

    前端系统框架模式分析.docx

    在前端系统的发展历程中,框架模式的演变起到了关键作用,从早期的无框架时代到现在的MVVM模式,每个阶段都反映了技术的进步和需求的变化。本文将深入探讨前端框架的变迁,以及不同模式的特点和问题。 首先,让我们...

    韩顺平php从model1到分层再到mvc并使用smarty笔记-2.doc

    MVC模式进一步优化了分层模式,它将应用程序分为模型(Model)、视图(View)和控制器(Controller)。这种模式将数据处理、界面展示和用户交互分离: - **模型(Model)**:处理数据和业务逻辑,例如`Admin.class....

    基于_NET的Web应用架构构建模式

    在更复杂的系统中,MVC模式有时需要扩展。Page Controller模式将每个Web页面与一个控制器关联,控制器处理该页面的所有请求。这种方式适合小型应用,但在大型系统中可能导致控制器过于庞大和复杂。为解决这个问题,...

Global site tag (gtag.js) - Google Analytics