HTML+Servlet+JavaBean实现MVC模式

首先要讲到传统的JSP文件有什么弊端:
弊端太多了,直接在JSP上写Java代码。大公司的项目都有分前后端的。这样的话,前端的人怎么活?
在网页上写Java代码,如果修改起来很麻烦。文件小还好说,文件大就难了。

所以这里引出了MVC模式。即将一个用户的请求以及服务器的处理分离开,分成:Model【模型】、View【视图】、Controller【控制器】。接下来以“登录”作为例子,将一下每个层次的作用。

Model【模型】:模型层,控制页面跳转。如:login.jsp填写好了表单,然后跳转到check.jsp,Model【模型】就处理页面的跳转。
View【视图】:视图应该是很好理解的。有HTML和JSP【极其不推荐使用JSP】。
Controller【控制器】:在拿到了“登录”表单的数据后,总要去判断数据是否正确吧?处理数据的过程就属于Controller【控制器】。

做到MVC分离,就会将一个web应用变成可拆分的。
如果不借助MVC框架,可以使用HTML+Servlet+JavaBean实现MVC模式

HTML很常见,就不多讲了。

Servlet:
Servlet属于JSP的底层类,有doGet()、doPost()、构造函数三种主要的函数组成。很好理解,在表单提交的时候,我们需要为表单设置method方式,<from method="post"> 即会调用doPost()方法。如果是<from method="get"> 就会调用doGet()方法。

可是Servlet说到底还是Java类,怎么会相应用户发出的请求呢?
这里就需要讲到web.xml的作用了。web.xml可以用来注册Servlet,能通过请求路径调用doPost()或者doGet()方法,最后再通过HttpResponse【在JSP中是response】对象反馈响应结果给用户

在web.xml中配置Servlet
新建一个包,包名为:model。在该包下新建一个Servlet类,名为Login
这里写图片描述

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
  	<!-- 一定要先设置servlet-name -->
  	<servlet-name>/model/Login</servlet-name>
  	<servlet-class>model.Login</servlet-class>
  </servlet>
  <servlet-mapping>
  	<!-- servlet-name与上一个的servlet-name一样 -->
  	<servlet-name>/model/Login</servlet-name>
  	<!-- 请求截取的路径,如果路径某 项目名/Login,就会调用model.Login类中的方法 -->
  	<url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>

这样Servlet已经配置完成了,接下来介绍一个JavaBean。用于处理逻辑。我们在前台拿到登录需要的账号与密码,总是要进行判断的吧?判断的逻辑就写在JavaBean中。JavaBean就是一个类。
新建一个包,包名为:model,在该包下新建一个类,类名为Login
登录需要用户名【username】和密码【password】。所以我们为Login.java类加上username和password属性,并自动生成get和set方法。并写了一个check()方法用于判断登录的用户名与密码是否相同。

package model;

public class Login {
	String username;
	String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int check() {
		if (username.equals(password))
			return 1;
		return 0;
	}

}

接着,我们写login.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>表单开发</title>
<script type="text/javascript">
	function check() {
		// 获取输入框的值
		var username = document.getElementById("username").value;
		var password = document.getElementById("password").value;
		// 获取显示两个错误信息的标签
		var check_username = document.getElementById("check_username");
		var check_password = document.getElementById("check_password");

		if (username.length == 0) {
			check_username.innerHTML = "用户名不能为空";
			return false;
		}
		if (password.length == 0) {
			check_username.innerHTML = "";
			check_password.innerHTML = "密码不能为空";
			return false;
		}
		return true;
	}
</script>
</head>
<body>
	<div id="content" align="center">
		<p align="center">登录界面</p>
		<form action="Login" method="post">
			<!-- onblur()函数作用:在元素失去焦点的时候调用 -->
			用户名:<input type="text" id="username" name="username" onblur="check()">
			<font id="check_username" color="red"></font> <br> 密码:<input
				type="password" id="password" name="password" onblur="check()">
			<font id="check_password" color="red"></font> <br> <input
				type="submit" onclick="return check()" value="登录">
		</form>
	</div>
</body>
</html>

这里主要看,我们表单提交的地址为Login,也就是在web.xml中看看哪个Servlet会处理Login这个字符串。查看web.xml中会发现是/model/Login类会处理这次请求,再看表单的method是post还是get,如果是post就会调用doPost()方法。如果是get就会调用doGet()方法,所以这里会调用/model/Login类中的doPost()方法。

现在我们打开/controll/Login类,去编写doPost()方法:

package controll;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/Login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
   
    public Login() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		
		// 得到login.html表单的值
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		// 新建控制器的对象
		controller.Login login = new controller.Login();
		login.setUsername(username);
		login.setPassword(password);
		// 处理username和password的匹配情况,将值返回给check
		int check = login.check();
		if(check == 1) {
			out.println("账号与密码相同");
			// 将username存入session
			HttpSession session = request.getSession();
			session.setAttribute("username", username);
			// 跳转到main.html
			response.sendRedirect("main.jsp");
		}
		else {
			// 弹出警告窗
			out.println("<script>alert('账号与密码不同')</script>");
			// 跳转到login.html
			out.println("<script>window.location='login.html';</script>");
		}
	}
}

看到如果账号与密码相同,会跳转到main.jsp。而且已经把username的值存入了session。那我们就新建main.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String username = (String)session.getAttribute("username");
	out.print("欢迎您," + username);
%>

整个web效果如下:
用户名为root、密码为root输入后
这里写图片描述

用户名为roo,密码为root输入后
这里写图片描述

整个工程下载地址:点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值