说明

本教程是,原文章发布系统教程的精编重制版,会包含每一节的源码,以及修正之前的一些错误。因为之前的教程只做到了评论模块,很多地方还不完美,因此重制版会修复之前的一些谬误和阐述不清的地方,而且,后期我会考虑完成该项目的后台管理。希望本教程提供的内容,可以成为JavaWeb初学者一套较为完整的练手项目。 

这一节正式开始编写用户登录的业务。

首先,回到前台登录的表单页面。

image.png

给form表单的action赋值:${pageContext.request.contextPath}/user?action=login

${pageContext.request.contextPath} 表示项目的跟路径。

这个表示请求/user的路由地址,同时加上get参数action,值为login。然后开始编写登录业务:

UserController

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取请求的行为
		String action = req.getParameter("action");
		
		//根据不同的action请求,进入不同的方法
		switch (action) {
		case "login":
			login(req,resp);
			break;

		default:
			break;
		}

	}

上面的代码应该还是比较清晰的,接受前台传过来的action,然后判断进入不同的方法。这些方法我们就干脆统一写在UserController里面。

	private void login(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("进入登录业务!");
	}

启动服务器,访问http://localhost:8080/login.jsp

填写表单,点击立即提交。结果发现报错了。

十二月 26, 2018 6:17:54 下午 org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet [com.article.controller.UserController] in context with path [] threw exception

java.lang.NullPointerException

at com.article.controller.UserController.doGet(UserController.java:20)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Unknown Source)

经过检查,发现action没有拿到,这个时候,发现地址栏的url为:http://localhost:8080/user?username=&password=

确实没有action,可是action明明已经写了的。

那就换一种思路,把action做成一个隐藏的input块吧。

	<div id="login" class="layui-row layui-col-space15">
	    <div class="layui-col-md6">
	      <div class="layui-card">
	        <div class="layui-card-header">用户登录</div>
	        <div class="layui-card-body">
	         	<!-- 这里写登录页面的主体 -->
	         	<form class="layui-form" action="/user" lay-filter="example">
	         		
	         	 <input type='text' value='login' name='action' hidden='true'>	
	         	
				  <div class="layui-form-item">
				    <label class="layui-form-label">用户名</label>
				    <div class="layui-input-block">
				      <input type="text" name="username" lay-verify="title" autocomplete="off" placeholder="请输入用户名" class="layui-input">
				    </div>
				  </div>
				  <div class="layui-form-item">
				    <label class="layui-form-label">密码</label>
				    <div class="layui-input-block">
				      <input type="password" name="password" placeholder="请输入密码" autocomplete="off" class="layui-input">
				    </div>
				  </div>
				  <div class="layui-form-item">
				    <div class="layui-input-block">
				      <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo1">立即提交</button>
				      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
				    </div>
				  </div>
				</form>
	        </div>
	      </div>
	    </div>
    </div>

再提交,就OK了,后台方法也进入了。

image.png

接下来,我们需要对用户名和密码进行一些基本的判断。简单来说就是去数据库中查询是否存在这样的数据。先把用户名和密码拿到。

	private void login(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("进入登录业务!");
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println("用户名:" + username + "," + "密码:" + password);
		
	}

测试效果:

进入登录业务!

用户名:admin,密码:123

接下来,需要去链接芒果数据库。先导入需要的jar包:

image.png

注意:web项目一定要把jar包放在这个lib目录,这样会自动引入的。

接着,为了方便获取数据库的链接,我们封装一个工具类:

image.png

package com.article.util;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
 
//mongodb 连接数据库工具类
public class MongoDBUtil {
    //不通过认证获取连接数据库对象
    public static MongoDatabase getConnect(){
        //连接到 mongodb 服务
        MongoClient mongoClient = new MongoClient("localhost", 27017);
 
        //连接到数据库
        MongoDatabase mongoDatabase = mongoClient.getDatabase("article");
 
        //返回连接数据库对象
        return mongoDatabase;
    }
 
}

下面是登录的完整业务方法,注释还算比较详细了。

	private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		System.out.println("进入登录业务!");
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println("用户名:" + username + "," + "密码:" + password);
		
		// 连接到数据库
        MongoDatabase mongoDatabase = MongoDBUtil.getConnect();  
        // 选择user表
        MongoCollection<Document> users = mongoDatabase.getCollection("users");
        //组合条件查询,注意要引入静态资源类:import static com.mongodb.client.model.Filters.*;
        FindIterable<Document> result = users.find(and(eq("username",username),eq("password",password)));
        //获取第一条数据(如果存在的话)
        MongoCursor<Document> it = result.iterator();
        Document user = null;
        while(it.hasNext()){
        	user = it.next();
        }
        
        //如果user存在,那就把username存入session备用,同时跳转到主页面。否则回到登录页面,提示用户名或者密码错误
        if(user != null){
        	req.getSession().setAttribute("username", username);
        	resp.sendRedirect("index.jsp"); //重定向
        	return;
        }
        
        req.setAttribute("err", "用户名或者密码错误");
        req.getRequestDispatcher("login.jsp").forward(req,resp);//请求转发
        
        
        
	}

为了在登录页看到错误信息,用EL表达式:

image.png

效果:

image.png

OK,以上就是完整的登录逻辑,现在启动Tomcat,试一试吧。

本章源码:

image.png


链接:https://pan.baidu.com/s/1EcwSUDbhX2bKthj58I52Sw 

提取码:11op 

复制这段内容后打开百度网盘手机App,操作更方便哦