2019-12-14-JDBC以及动态菜单

时间格式转换

//当前时间及格式转换
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
String[] split = dateString.split("-");
String date = split[0]+"年"+split[1]+"月"+split[2]+"日";

JDBC的使用

注册驱动
 Class.forName("com.mysql.jdbc.Driver");//mysql数据库	
//Class.forName("oracle.jdbc.driver.OracleDriver");//Oracle数据库
建立JDBC和数据库之间的connect的连接
Connection c = DriverManager.getConnection("jdbc:mysql://IP:port/exam?characterEncoding=UTF-8", "username", "password");
//Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","username","password");
创建statement或者preparestatement接口
Statement s = conn.createStatement();
String sql = "insert into t_courses values(null,"+"'数学')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题,后面说明
s.execute(sql);
处理和显示结果
ResultSet rs = s.executeQuery(sql);
释放资源

在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕进行关闭。

补充说明
	PreparedStatement与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
	使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,数据库就不会再次编译,这样能够显著提高性能。
	String sql = "update t_course set course_name =? where course_id=?";
	后面需要用到PreparedStatement接口创建的pstmt的set方法给占位符进行赋值。注意一点,这里的参数索引是从1开始的。
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName);  //利用Preparedstatement的set方法给占位符赋值
pstmt.setInt(2, courseId);
pstmt.executeUpdate();

动态菜单

动态菜单是什么

动态菜单即是实现动态权限的菜单管理,是根据不同的用户显示与之相对应的菜单,达到每个用户中的菜单中的内容不一定相同的效果。

动态菜单原理

将数据的角色权限放到数据库中,当一个用户访问菜单时,即刻从数据库中获取当前用户的所 对应的菜单选项。

	例如,
	数据库中有三张表如下:user(用户表),menu(菜单表),conn(关联表)
	访问菜单时查询数据库,
		step1,查询出该user,
		step2,通过该user查询出conn中的所有可用的menu的id
		step3,再通过该menu的id查询出所有menu作为结果集resultList

最后,将结果集resultList反馈给前端。因为每个用户的关联表中关联的内容不同,所以可 以实现不同用户显示不同的菜单选项。

demo

登录页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<html>

	<head>
		<title>test</title>
	</head>

	<body>
	<form action="/temp/loginServlet" method="post" id="myform">
		用户名:<input type="text" name="username"/>
		<br/>
		密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/>
		<br>
		<input type="submit" value="登录">
		<a href="#" id = "res">重置</a>
		<br>
		校验结果:<span><%=request.getAttribute("msg") %></span>
	</form>
	</body>
	<script type="text/javascript">
	document.getElementById("res").onclick = function() {
		alert("已重置");
		document.getElementById("myform").reset();
	}
	</script>
</html>

登录后的页面

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page import="bean.Menu"%>
<html>

  <style>
    .box {
      background-color: #EEEEEE;
      left: 5px;
      top: 3px;
      width: 99%;
      height: 650px;
      overflow: hidden;
      overflow-x: hidden;
      position: relative;
    }
    
    .box1,
    .box2, {
    /*盒子重叠放置,使用哪个盒子哪个盒子显示*/
      background-color: #EEEEEE;
      width: 100%;
      height: 100%;
      overflow: hidden;
      overflow-x: hidden;
    }
  </style>

  <head>
    <title>test</title>
  </head>

  <body>
    用户登录&nbsp;&nbsp;&nbsp;
    <a href="login.jsp"><button>返回登录</button></a>
    <br>
    <table>
      <tr>
        <td>
          <c:if test="${empty username }">
            <a href="login.jsp">请登录</a>
          </c:if>
          <c:if test="${not empty username }">
            用户 &nbsp;${username } &nbsp;登录成功
          </c:if>
        </td>
      </tr>
      <tr>
        <td>登录时间:
          <c:if test="${not empty date }">
            ${date }
          </c:if>
        </td>
      </tr>
    </table>
    <hr> 功能菜单如下:
    <hr>
	<div style="float: left;width: 15%;top: 300px;">
	    <c:forEach items="${menuList }" var="p">
      <div>
        <br> &nbsp;
        <span><a href="${p.URL }">${p.MENU_NAME }</a></span>
<%--            <c:if test="${not empty p.USABLE} ">
            <span><a href="${p.URL }">${p.MENU_NAME }</a>&nbsp;可用</span>
          </c:if>   --%>     
      </div>
    </c:forEach>
	</div>
    <div style="float: right;width: 80%;top: 300px;">
      <div class="box" id="box">
        <div class="box1" id="box1">
          <center>
          	<h1>内容1</h1>
          </center>
        </div>
        <div class="box2" id="box2">
          <h2>内容2</h2>
        </div>
        </div>
      </div>
  </body>
</html>

servlet

//第一部分
//servlet中doGet,其他部分未附
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置request格式
		request.setCharacterEncoding("utf-8");
		//接收参数
		String username =  request.getParameter("username");
		String password = request.getParameter("password");
		
		
		if (username==null||username =="") {
			request.setAttribute("msg", "请输入用户名");
			request.getRequestDispatcher("login.jsp").forward(request, response);
			return;
		}
		//根据username查询出user实体
		UserDao userDao = new UserDao();
		User user = userDao.findByUsername(username);
		if (password.equals(user.getPassword())) {
			//通过验证,更改登录状态flag为1
			userDao.updateLoginFlag(1,username);
			
			//更新登录时间
			//当前时间及格式转换
			Date currentTime = new Date();
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
			String dateString = formatter.format(currentTime);
			System.out.println(dateString);
			String[] split = dateString.split("-");
			String date = split[0]+"年"+split[1]+"月"+split[2]+"日";
			
			//向数据库中插入时间
			userDao.updateLoginDate(date,username);
			
			//根据用户向前端传递菜单实体
			MenuDao menuDao = new MenuDao();
			Menu menu = new Menu();
			
			List<Menu> list= menuDao.getMenuBean(username);
			System.out.println("list:--->>>"+list);
			request.setAttribute("menuList", list);
			
			//登录成功,响应前端
			request.setAttribute("msg", "登录成功");
			request.setAttribute("username", username);
			request.setAttribute("date", date);
			request.getRequestDispatcher("index.jsp").forward(request, response);
		}
		else {
			request.setAttribute("msg", "请检查用户名或密码");
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
//第二部分
//前面第一部分所需要调用的方法如下
	public User findByUsername(String username) {
		// 根据username查询出user
		try {
			//获得连接
			Connection connection = getConnection();
			//创建statement
			Statement sql = connection.createStatement();
			User user = new User();

			ResultSet rs = sql.executeQuery("SELECT \"username\",\"password\" FROM \"temp\" WHERE \"username\" ="+username);
			while (rs.next()) {
				//结果存到user实体
				System.out.println(rs.getString(1)+"--"+rs.getString(2));
				user.setUsername(rs.getString(1));
				user.setPassword(rs.getString(2));
			}
			sql.close();
			connection.close();
			return user;

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}
	
		public void updateLoginFlag(Integer i, String username) {
		// 更新登录状态
		try {
			Connection connection = getConnection();
			Statement sql = connection.createStatement();

			sql.executeUpdate("UPDATE \"temp\" SET \"flag\" = "+i+"WHERE \"username\" ="+username);
			sql.close();
			connection.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void updateLoginDate(String date,String username) {
		// 更新登录时间
		try {
			Connection connection = getConnection();
			Statement sql = connection.createStatement();
			//UPDATE "temp" SET "Ltime" = 123456 WHERE "username" = 123
			sql.executeUpdate("UPDATE \"temp\" SET \"Ltime\" = '"+date+"' WHERE \"username\" = " +username);
			sql.close();
			connection.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","user","password");
		return connection;
	}
//第三部分
//前面第一部分所需要调用的方法如下
	public List<Menu> getMenuBean(String username) {
		//根据userid
		try {
			//获得连接
			Connection connection = getConnection();
			//创建statement
			Statement sql = connection.createStatement();
			
			//拼接sql语句
			String sqlString = "SELECT A.MENU_ID,A.MENU_NAME,A.URL,A.USABLE "
					+ "FROM MENU A,\"temp\" B,MENU_USER C "
					+ "WHERE C.USER_ID=B.\"username\" AND A.MENU_ID=C.MENU_ID AND B.\"username\"= "+username;
			//执行查询
			ResultSet rs = sql.executeQuery(sqlString);
			List<Menu> list = new ArrayList<Menu>();
			
			int i = 0;
			while (rs.next()) {
				Menu menu = new Menu();
				//按字段取出值放入menu实体
				menu.setMENU_NAME(rs.getString("MENU_NAME"));
				menu.setURL(rs.getString("URL"));
				menu.setUSABLE(rs.getString("USABLE"));
				
				//判断菜单是否可用
				if ("1".equals(menu.getUSABLE())) {
					//将menu实体添加到list
					list.add(i,menu);
					i++;
				}
				
			}
			sql.close();
			connection.close();
			return list;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

此外,需要创建menu和user的实体类

public class Menu {
	private	Integer MENU_ID     ;
	private	String MENU_NAME    ;
	private String URL          ;
	private	String USABLE       ;
	
	
	@Override
	public String toString() {
		return "Menu [MENU_ID=" + MENU_ID + ", MENU_NAME=" + MENU_NAME + ", URL=" + URL + ", USABLE=" + USABLE + "]";
	}
	public Integer getMENU_ID() {
		return MENU_ID;
	}
	public void setMENU_ID(Integer mENU_ID) {
		MENU_ID = mENU_ID;
	}
	public String getMENU_NAME() {
		return MENU_NAME;
	}
	public void setMENU_NAME(String mENU_NAME) {
		MENU_NAME = mENU_NAME;
	}
	public String getURL() {
		return URL;
	}
	public void setURL(String uRL) {
		URL = uRL;
	}
	public String getUSABLE() {
		return USABLE;
	}
	public void setUSABLE(String uSABLE) {
		USABLE = uSABLE;
	}
}

public class User {
    private String	username        ;
    private 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;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}
posted @ 2024-05-30 17:30  EQ-雪梨蛋花汤  阅读(10)  评论(0)    收藏  举报