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











  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值