JSP 寫登錄註冊

   

今天又把jsp註冊登錄做了一下  從index.jsp寫表單開始


action="user.do?method=login" 寫註冊 需要注意給用戶名 密碼添加name屬性

寫完第一個jsp文件 再寫servlet 新建new->package->(設置包名爲com.servlet)->新建servlet文件


需要注意可以將which method stubs would you like to create?下面的√全取消

設置servlet名字爲UserServlet後點擊next->設置Servlet/JSP Mapping URL爲在原來新建的jsp文件寫的user.do就行了


這是我寫的UserServlet;

package com.servlet;

import java.io.IOException;

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

import com.dao.UserDAO;
import com.pojo.User;

public class UserServlet extends HttpServlet {

	private UserDAO userdao = new UserDAO();
	
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	
		response.setContentType("text/html;charset=utf-8");
		String method = request.getParameter("method");
		if("login".equals(method)){
			doLogin(request , response);
		}
		
		if("regist".equals(method)){
			doRegist(request, response);
		}
	}

	private void doRegist(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String repassword = request.getParameter("repassword");
		String code = request.getParameter("code");
	
		if(!password.equals(repassword)){
			response.getWriter().print("<script>alert('兩次密碼不一致!');location='regist.jsp'</script>");
			return ;
		}
		String realCode = (String) request.getSession().getAttribute("code");
		if(!code.equalsIgnoreCase(realCode)){
			response.getWriter().print("<script>alert('驗證碼不正確!');location='regist.jsp'</script>");
			return ;
		}
		int n = userdao.regist(username, password);
		if(n>0){
			response.getWriter().print("<script>alert('註冊成功!');location='index.jsp'</script>");
		}else{
			response.getWriter().print("<script>alert('註冊失敗!');location='regist.jsp'</script>");
		}
	}
	private void doLogin(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		User user = userdao.login(username, password);
		if(user!=null){
			//如果登錄成功 在session中存值
			request.getSession().setAttribute("user", user);
			request.getRequestDispatcher("main.jsp").forward(request, response);
			return ;
		}
		response.sendRedirect("index.jsp");
	}
	
}

這裏 雖然很簡單 做一個if判斷 執行method的方法

這是提前寫好的DBUtil.java 連接數據庫

package com.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class DBUtil {

	// 1.實例化連接池
	public static Vector<Connection> connectionPool = new Vector<Connection>();

	// 2.初始化連接池
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			for (int i = 0; i < 15; i++) {
				Connection connection = DriverManager.getConnection(
						"jdbc:mysql://127.0.0.1:3306/s69", "root", "admin");
				connectionPool.add(connection);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 3.取連接
	public static Connection getConnection() {
		Connection connection = connectionPool.get(0);
		connectionPool.remove(0);
		return connection;
	}
	// 4.釋放連接
	public static void releaseConnection(Connection connection) {
		connectionPool.add(connection);
	}
	// 5.增刪改
	public static int zsg(String sql, Object... p) {
		Connection connection = getConnection();
		int n = 0;
		try {
			PreparedStatement ps = connection.prepareStatement(sql);
			for (int i = 0; i < p.length; i++) {
				ps.setObject(i + 1, p[i]);
			}
			n = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.releaseConnection(connection);
		}
		return n;
	}

	// 查詢
	public static List query(Class c, String sql, Object... p) {
		Connection connection = getConnection();
		List list = null;
		try {
			PreparedStatement ps = connection.prepareStatement(sql);
			for (int i = 0; i < p.length; i++) {
				ps.setObject(i + 1, p[i]);
			}
			ResultSet rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int count = rsmd.getColumnCount();
			list = new ArrayList();
			while (rs.next()) {
				Object object = c.newInstance();

				for (int i = 1; i <= count; i++) {

					String fieldname = rsmd.getColumnLabel(i);
					Field field = c.getDeclaredField(fieldname);
					field.setAccessible(true);
					field.set(object, rs.getObject(i));
				}
				list.add(object);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.releaseConnection(connection);
		}
		return list;

	}

}

增刪改就相當於一個executeUpdate(); 寫一個zsg函數返回值設爲(String sql,Object... p) 根據不同的sql執行不同的數據庫操作

// 5.增刪改
	public static int zsg(String sql, Object... p) {

		Connection connection = getConnection();

		int n = 0;
		try {
			PreparedStatement ps = connection.prepareStatement(sql);

			for (int i = 0; i < p.length; i++) {
				ps.setObject(i + 1, p[i]);
			}

			n = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.releaseConnection(connection);
		}
		return n;
	}

而查詢則返回一個List集合

// 查詢
	public static List query(Class c, String sql, Object... p) {
		
		Connection connection = getConnection();
		List list = null;
		try {
			PreparedStatement ps = connection.prepareStatement(sql);
			for (int i = 0; i < p.length; i++) {
				ps.setObject(i + 1, p[i]);
			}
			ResultSet rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int count = rsmd.getColumnCount();
			list = new ArrayList();
			while (rs.next()) {
				Object object = c.newInstance();
				for (int i = 1; i <= count; i++) {
					String fieldname = rsmd.getColumnLabel(i);
					Field field = c.getDeclaredField(fieldname);
					field.setAccessible(true);
					field.set(object, rs.getObject(i));
				}
				list.add(object);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.releaseConnection(connection);
		}
		return list;
	}

有流的操作需要關閉流

field.set(object, rs.getObject(i));

寫UserServlet的時候會寫到dao層的方法所以在UserDAO.java中

package com.dao;

import java.util.List;

import com.pojo.User;
import com.util.DBUtil;
//第三步
public class UserDAO {
	//登錄
	public User login(String username, String password) {
		String sql = "select username , password from userinfo where username = ? and password = ? ";
		List<User> list = DBUtil.query(User.class, sql, username,password);
		if (list.size() > 0) {
			return list.get(0);
		}
		return null;
	}
	public static int regist(String username, String password) {
		String sql="insert into userinfo(username,password)values(?,?)";
		int n=DBUtil.zsg(sql, username,password);
		return n;
	}
}

將userinfo數據庫表中的字段寫到com.pojo的User.java中

package com.pojo;
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;
	}
}

然後就是其他jsp的界面實現了

main.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:if test="${not empty user }">
	歡迎:${user.username }
</c:if>
<c:if test="${empty user}">
	<a href="index.jsp">登錄</a>|
	<a href="regist.jsp">註冊</a>
</c:if>

regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<form action="user.do?method=regist" method="post">
    用戶名:<input type="text"name="username"/><br>
    密碼:<input type="password"name="password"/><br>
    確認密碼:<input type="password"name="repassword"/><br>
    驗證碼:<input type="text" name="code"/><img src="image.do"/><br>
      <input type="submit"value="註冊"/> 
</form>

哈哈哈 心不靜 寫不下去了 就到這裏吧 對於Jsp的學習我還是感覺是後知後覺的 領悟的太慢了 可能還是對於java的基礎知識沒那麼瞭解 所以一些方法的使用還是不會 不熟。這是個問題。

 哦對了 還有這個驗證碼的ImageServlet.java:

package com.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

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

public class ImageServlet extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String s="abcdefghijklmnopqrstuvwxyz0123456789";
		Random random=new Random();
		StringBuffer buffer=new StringBuffer();
		
		
		for (int i = 0; i <4; i++) { //表示驗證碼從 36個值中取四個
			int index=random.nextInt(36);
			char ch=s.charAt(index);
			buffer.append(ch);
		}
		String code=buffer.toString();
		request.getSession().setAttribute("code",code);
		
		
		//畫驗證碼圖
		BufferedImage bufferedImage=new BufferedImage(100,30,BufferedImage.TYPE_INT_RGB);
		
		Graphics graphics=bufferedImage.getGraphics();
		
		graphics.setColor(Color.RED);
		graphics.fillRect(0, 0, 100, 30);  //填充矩形區域
		
		graphics.setColor(Color.YELLOW);  //設置驗證碼裏面文字顏色
		graphics.setFont(new Font("羅體",Font.BOLD,30)); //設置圖片裏面驗證碼的字體及大小
		
		graphics.drawString(code.charAt(0)+"", 10, 29);
		graphics.drawString(code.charAt(1)+"", 30, 26);
		graphics.drawString(code.charAt(2)+"", 50, 27);
		graphics.drawString(code.charAt(3)+"", 70, 25);
		
		
		OutputStream outputStream = response.getOutputStream();
		ImageIO.write(bufferedImage, "JPEG", outputStream);
		outputStream.close();

	}
	
}

想要做一個好項目 就是很多功能都能實現的那種。以前感覺學習編程會很吃力,其實現在學到了現在才感覺到java的深奧。很多東西都是需要自己一點一滴去學習去領悟的!!!

如果你恰好是初學java的小白,請別放棄。請加把勁。OJBK











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章