Java EE实战1---开发日志

引言:

1、博主目标是成为一名Java开发工程师,所以自学JavaEE,这是博主第一个实战项目,希望将开发过程记录下来,如果有错误,请各位看官评论留言,我一定虚心求教,认真改正。
2、另外此次实战只是我的第一阶段实战,并未用到mybatis和spring框架实现,仅仅用了jsp,servlet,html,css,mvc框架,JDBC技术,比较老套以及繁琐,意在于锻炼基础,以便以后对框架理解更为深入,增加核心竞争力。
3、此篇博客是第一个功能块的实现,前期准备以及项目描述见:项目描述
4、目前代码不适用于重名的情况,对于不重名的情况没问题

基本思路:

1、登录 == 让用户将信息从前端输入,进入servlet后输入进user模型(模型存储在JavaBeens包里面,其中变量名字和数据库一致),将user模型传递给service包下面的registerAndLoginService处理,分别判断错误情况走专门的错误函数,返回特定的错误代码,正确的进入dao层,与数据库交互。然后向回走,servlet得到service返回的值,根据不同情况,封装不同的resultMap反馈给前端。
2、注册 == 让用户将信息从前端输入,进入servlet后输入进user模型,将user模型传递给service包下面的registerAndLoginService处理,分别判断错误情况走专门的错误函数,返回特定的错误代码,正确的进入dao层,与数据库交互。然后向回走,servlet得到service返回的值,根据不同情况,封装不同的resultMap反馈给前端。
3、登出 == 将已有的session中的键值对中的值修改为null

代码实现:

登录

1、jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="loginServlet" method="post">
		<div>姓名:<input type="text" name="name" id="" /></div>
		<div>性别:<input type="password" name="sex" id="" /></div>
		<div>年龄:<input type="password" name="age" id="" /></div>
	<input type="submit" value="登录" />
	</form>
</body>
</html>

2、servlet

由前端走进后端,表单先被服务器拦截,根据xml的配置被发送到loginServlet中

public class loginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Map<Integer,String> isLogInMap = new HashMap<Integer,String>();
		String isLogIn = (String)request.getSession().getAttribute("name");
		if(isLogIn != null) {//判断是否重复登陆
			isLogInMap.put(2,"请勿重复登陆,如果想重新登陆,请先登出。");
			request.setAttribute("key", 2);
			request.setAttribute("isLogInMap", isLogInMap);
			request.getRequestDispatcher("repeateLogIn.jsp").forward(request, response);//打包把信息发走,防止重复登陆
		}
		
		request.setCharacterEncoding("UTF-8");
		Map<Integer,String> resultMap = new HashMap<Integer,String>();
		
		String name = request.getParameter("name").trim();
		String sex = request.getParameter("sex").trim();
		String age = request.getParameter("age").trim();
		
		user u = new user();
		u.setName(name);//将获得的数据放进模型
		u.setSex(sex);
		u.setAge(age);
		
		registerAndLoginService rls = new registerAndLoginService();
		int result = rls.logInService(u);//先走进service,再出来返回给servlet返回代码,再根据不同情况进行封装
		switch(result) {
		case 1 :
			resultMap.put(1, "恭喜您,登录成功");
			request.getSession().setAttribute("name", u.getName());//设置session方便之后判断是否已经登陆
		case 0 :
			resultMap.put(0, "对不起,登录不成功,您并未注册,请先注册");
		case -1 :
			resultMap.put(-1, "对不起,登录不成功,名字为空");
		case -2 :
			resultMap.put(-2, "对不起,登录不成功,性别为空");
		case -3 :
			resultMap.put(-3, "对不起,登录不成功,年龄为空");
		}
		
		request.setAttribute("resultMap", resultMap);//打包发走到显示登陆结果页面
		request.setAttribute("key", result);
		request.getRequestDispatcher("loginResult.jsp").forward(request, response);
	}

}

3、service

数据准备好了,放进模型中,给service,service根据不同情况走向不同方向,返回给servlet不同的代码

	/**
	 * 登录服务函数,向数据库 user表里插入用户信息
	 * 返回1说明查找用户成功,返回0说明查找的用户不存在要先去注册
	 * 返回-1说明数据有错误,用户名为空
	 * 返回-2说明数据有错误,性别为空
	 * 返回-3说明数据有错误,年龄为空
	 */
	public int logInService(user u) {
		registerAndLoginDao rld = new registerAndLoginDao();
		errorRegisterAndLoginSet errorRegister = new errorRegisterAndLoginSet();
		if(u.getName().equals("") || u.getName() == null) {
			return errorRegister.errorLogInOne();
		}
		if(u.getSex().equals("") || u.getSex() == null) {
			return errorRegister.errorLogInOne();
		}
		if(u.getAge().equals("") || u.getAge() == null) {
			return errorRegister.errorLogInOne();
		}
		return rld.logInDao(u);
	}

下面附上错误处理:

	public class errorRegisterAndLoginSet {
		/**
		 * 登陆时候没输入用户名,返回错误代码-1
		 */
		public int errorLogInOne() {
			return -1;
		}
	
		/**
		 * 登陆时候没输入性别,返回错误代码-2
		 */
		public int errorLogInTwo() {
			return -2;
		}
		
		/**
		 * 登陆时候没输入年龄,返回错误代码-3
		 */
		public int errorLogInThree() {
			return -3;
		}
}

4、dao层

如果模型正确就会走到与数据库交互层,即dao层,她负责撰写sql语句,和数据库交互。

public int logInDao(user u) {
		String sql = "select * from user where"
				 +"(name ='"+u.getName()+"'and sex ='"+u.getSex()+"'and age ='"+u.getAge()+"');";
		JDBCTools jdbct = new JDBCTools();//这个是自己封装的JDBC
		return jdbct.Query(sql);//Query函数返回查询到的条数
	}

5、返回

从dao层返回数值到service 再回到servlet,在最后由servlet发给显示结果页面。

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Map<Integer,String> resultMap = (Map<Integer,String>)request.getAttribute("resultMap");
		int key = (Integer)request.getAttribute("key");
	%>
	<div><b><%=resultMap.get(key) %></b></div>
	<div>
		<a href="main.html">点击回到主页面</a>
	</div>
	<%
		if(key <= 0){
			%>
			<div>
				<a href="register.jsp">点击重新返回注册页面</a>
			</div>
			<%
		}
	%>
	<a href="login.jsp">点击进入登陆页面</a>
</body>
</html>

注册

1、jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="registerServlet" method="post">
		<div>姓名:<input type="text" name="name" id="" /></div>
		<div>
		性别:
			<input type="radio" name="sex" id="" value="male" /><input type="radio" name="sex" id="" value="female" /></div>
		<div>年龄:<input type="text" name="age" id="" /></div>
		<div>权限:<input type="text" name="grade" id="" /></div>
		<input type="submit" value="点击注册" />
	</form>
</body>
</html>

2、servlet(接收数据->处理数据->发送数据)

由前端走进后端,表单先被服务器拦截,根据xml的配置被发送到registerServlet中

public class registerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		Map<Integer,String> resultMap = new HashMap<Integer,String>();
		
		String name = request.getParameter("name").trim();//获取数据
		String sex = request.getParameter("sex").trim();
		String age = request.getParameter("age").trim();
		String grade = request.getParameter("grade").trim();
		
		user u = new user();//搭建模型
		u.setName(name);
		u.setSex(sex);
		u.setAge(age);
		u.setGrade(grade);
		
		registerAndLoginService rls = new registerAndLoginService();
		int result = rls.registerService(u);//发送走模型处理希望得到相应的返回值
		switch(result) {//根据不同情况进行封装
		case 1 :
			resultMap.put(1, "恭喜您,注册成功");
		case 0 :
			resultMap.put(0, "对不起,注册不成功,数据库出现问题");
		case -1 :
			resultMap.put(-1, "对不起,注册不成功,名字为空");
		case -2 :
			resultMap.put(-2, "对不起,注册不成功,权限为空");
		case -3 :
			resultMap.put(-3, "对不起,注册不成功,重复注册");
		}
		
		request.setAttribute("resultMap", resultMap);
		request.setAttribute("key", result);//最后打包发走
		request.getRequestDispatcher("registerResult.jsp").forward(request, response);
	}

}

3、service

数据准备好了,放进模型中,给service,service根据不同情况走向不同方向,返回给servlet不同的代码

/**
	 * 注册服务函数,向数据库 user表里插入用户信息
	 * 返回1说明插入成功,返回0说明插入失败但是数据没错,数据库的问题
	 * 返回-1说明数据有错误,用户名为空
	 * 返回-2说明数据有错误,权限为空
	 */
	public int registerService(user u) {
		registerAndLoginDao rld = new registerAndLoginDao();
		errorRegisterAndLoginSet errorRegister = new errorRegisterAndLoginSet();
		int result = rld.logInDao(u);
		if(result > 0) {
			return errorRegister.errorRegisterFour();//一定提前把模型里的信息查一下库,看有没有,有的话不可以重复注册
		}
		if(u.getName().equals("") || u.getName() == null) {
			return errorRegister.errorRegisterOne();
		}
		if(u.getSex().equals("") || u.getSex() == null) {
			u = errorRegister.errorRegisterTwo(u);
		}
		if(u.getAge().equals("") || u.getAge() == null) {
			u = errorRegister.errorRegisterTwo(u);
		}
		if(u.getGrade().equals("") || u.getGrade() == null) {
			return errorRegister.errorRegisterThree();
		}
		return rld.registerDao(u);//正确走入dao层
	}

附上相应的错误处理

public class errorRegisterAndLoginSet {
	/**
	 * 注册名字不可以为空,返回错误代码-1
	 */
	public int errorRegisterOne() {
		return -1;
	}
	
	/**
	 *注册性别和年龄选写,返回处理后的结果
	 */
	public user errorRegisterTwo(user u) {
		if(u.getSex() == null || u.getSex().equals("")) {
			u.setSex(null);
		}else {
			u.setAge(null);
		}
		return u;
	}
	
	/**
	 * 注册时候用户权限不可不填,返回错误代码-2
	 */
	public int errorRegisterThree() {
		return -2;
	}
	
	/**
	 * 重复注册,返回错误代码-3
	 */
	public int errorRegisterFour() {
		return -3;
	}
}

4、dao层

如果模型正确,就会进入dao层,与数据库交互,插入值进库里面,返回1为正确,0为失败

public class registerAndLoginDao {
	public int registerDao(user u) {
		String sql = "insert into user(name,sex,age,grade) values"
					 +"('"+u.getName()+"','"+u.getSex()+"','"+u.getAge()+"','"+u.getGrade()+"')";
		JDBCTools jdbct = new JDBCTools();
		return jdbct.update(sql);//update函数功能之一就是插入一条信息,返回插入条数,1正确,0失败
	}
}

5、返回

最终在servlet中把有效信息打包发到展示页面

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Map<Integer,String> resultMap = (Map<Integer,String>)request.getAttribute("resultMap");
	int key = (Integer)request.getAttribute("key");
%>
	<div><b><%=resultMap.get(key) %></b></div>
	<div>
		<a href="main.html">点击回到主页面</a>
	</div>
	<%
		if(key < 1){
			%>
			<div>
				<a href="register.jsp">点击重新返回注册页面</a>
			</div>
			<%
		}
	%>
	<div>
		<a href="login.jsp">点击进入登陆页面</a>
	</div>
</body>
</html>

登出

就是修改一下当前状态下session的值,把键值对中的值改为null

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	 <%
	 	session.setAttribute("name", null);
	 %>
	 <b>您已经登出本超市系统,欢迎下次光临!</b>
	 <div>
		<a href="main.html">点击重新返回主页面</a>
	 </div>
	  <div>
		<a href="login.jsp">点击重新返回注册页面</a>
	 </div>
</body>
</html>

Sum Up

1、一定注意,因为表单是post方法提交的,所以系统默认的编码会导致中文乱码,所以在服务器即servlet代码段开始的地方加一句:request.setCharacterEncoding(“UTF-8”);即可。
2、一定注意登陆时候的逻辑,我一个设备上只能同时登陆一个账号,如果想变换的话,必须先登出,之后再重新登陆,所以在登陆时候,一定先查一查当前是否已经登陆过了(看session),已经登录过了,便不可以再次登录。
3、登录之后一定要把session设置为登陆状态,即把name的值设置成当前登录用户,因为在超市系统中任何操作都要登陆才行,所以啥操作之前都要判断是否登录,用的就是session,所以必须设置!
4、一定注意注册时候的逻辑,注册成功可以在注册,或者直接登录,或者返回主页面,已经注册过的用户不允许反反复复注册,所以要针对来的模型先查一遍看是否已经存在一模一样的人,存在说明注册失败,转失败函数,不存在继续进入dao层。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值