zoukankan      html  css  js  c++  java
  • 我的第一个javaweb学习----模仿社区网站(三)

    写注册界面的后台

    首先得建立一张数据库表,用于存储用户信息的userinfo表,包括注册时间,昵称,签名等

    受理注册信息的servlet

    然后在servlet包下建立一个注册的Regservlet的Servlet类,用于接收网页传来的信息,并完成是否有邮箱重复检查,和添加用户信息,这里只给出dopost函数,因为表单提交是不想被看见的,

    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		String email=request.getParameter("email");
    		String username=request.getParameter("nickname");
    		String password=request.getParameter("password");
    		
    		UserinfoDao ud=new UserInfoDaoImp();
    		int counts=ud.checkEmail(email);
    		if(counts==0) {
    			UserInfo userinfo=new UserInfo();
    			userinfo.setEmail(email);
    			userinfo.setNocname(username);
    			userinfo.setPassword(MD5.MD5(password));
    			ud.addUserinfo(userinfo);
    			System.out.println("注册成功");
    			response.sendRedirect(request.getContextPath()+"/jsp/regpage.jsp");
    		}else {
    			System.out.println("邮箱已被占用,请重新注册!");
    			request.setAttribute("msg", "邮箱已被占用,请重新注册!");
    			request.getRequestDispatcher("/jsp/regpage.jsp").forward(request, response);;
    		}
    		
    	}
    
    

    理解重点:请求转发和重定向

    这里有一篇比较好理解的博客

    简单的理解就是请求的次数不同,
    request.getRequestDispatcher(url).forward(request,reponse),始终都只有一次请求,因为每次转发都带着同一条request,同时setAttribute属性的值也是不变的,
    response.sendRedirect(url),每次重定向都发出新的请求,request里面的setAttribute的属性值没有了,是null

    建立注册功能的Dao层

    建一个接口UserInfoDao,写两个抽象方法,检查邮箱和注册的,还有一个是用于注册的抽象方法

    public interface UserinfoDao {
      int checkEmail(String email);
      //检查注册
      void addUserinfo(UserInfo userinfo);
      UserInfo checkLogin(UserInfo userinfo);
    }
    
    

    建立实现上面接口的类

    package com.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.domain.UserInfo;
    import com.utilDB.DBUtils;
    
    public class UserInfoDaoImp implements UserinfoDao{
    
    	DBUtils db=DBUtils.getIntstance();
    	Connection conn=null;
    	PreparedStatement ps=null;
    	ResultSet rs=null;
    	@Override
    	//检查email 是否已存在用户
    	public int checkEmail(String email) {
    		// TODO Auto-generated method stub
    		
    		try {
    			conn = db.getConnection();
    			ps = conn.prepareStatement("select count(*) counts from userinfo where email=?" );
    			ps.setString(1, email);
    			rs =ps.executeQuery();
    			if(rs.next()) {    //习惯性的检查是否有记录  如果没有记录直接get的话会有异常
    				int i=rs.getInt("counts");
    				
    				return rs.getInt("counts");
    			}
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			//好习惯记得每次关闭连接,和关闭顺序
    			db.close(rs);
    			db.close(ps);
    			db.close(conn);
    		}
    		return 0;
    	}
    
    	public void addUserinfo(UserInfo userinfo) {
    		// TODO Auto-generated method stub
    		try {
    			try {
    				conn =db.getConnection();
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}  //记得获取连接,因为每一次都会关闭
    			conn.setAutoCommit(false);   //先关闭自动提交
    			ps=conn.prepareStatement("insert into userinfo(email,nicname,password) value(?,?,?)");
    			System.out.println(userinfo.getEmail()+":"+userinfo.getNocname()+":"+userinfo.getPassword());
    			ps.setString(1, userinfo.getEmail());
    			ps.setString(2, userinfo.getNocname());
    			ps.setString(3, userinfo.getPassword());
    			ps.executeUpdate();
    			conn.commit();  //记得执行完成后,完成提交
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			try {
    				conn.rollback();   //期间出现异常就回滚
    			} catch (SQLException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			e.printStackTrace();
    		}finally {
    			db.close(ps);
    			db.close(conn);
    		}
    	}
    	
    	public UserInfo checkLogin(UserInfo userinfo) {
    		try {
    			conn = db.getConnection();
    			ps = conn.prepareStatement("select * from userinfo where email=? and password=?" );
    			ps.setString(1, userinfo.getEmail());
    			ps.setString(2, userinfo.getPassword());
    			rs =ps.executeQuery();
    			if(rs.next()) {    //习惯性的检查是否有记录  如果没有记录直接get的话会有异常
    				UserInfo user =new UserInfo();
    				user.setEmail(rs.getString("email"));
    				user.setNocname(rs.getString("nicname"));
    				user.setPassword(rs.getString("password"));
    				user.setHead_url(rs.getString("head_url"));
    				user.setRegtime(rs.getDate("regtime"));
    				user.setSingn(rs.getString("sign"));
    				return user;
    			}
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			//好习惯记得每次关闭连接,和关闭顺序
    			db.close(rs);
    			db.close(ps);
    			db.close(conn);
    		}
    		return null;
    	}
      
    }
    
    

    执行的都是对数据库的增删改查,可以体现java的结偶,每一块都独立,

    临时存储用户信息的类UserInfo方便我们不用每一次都去查数据库,就是简单的set,get方法

    public class UserInfo {
    
    	private int id;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public String getNocname() {
    		return nocname;
    	}
    	public void setNocname(String nocname) {
    		this.nocname = nocname;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public String getHead_url() {
    		return head_url;
    	}
    	public void setHead_url(String head_url) {
    		this.head_url = head_url;
    	}
    	public Date getRegtime() {
    		return regtime;
    	}
    	public void setRegtime(Date regtime) {
    		this.regtime = regtime;
    	}
    	public String getSingn() {
    		return singn;
    	}
    	public void setSingn(String singn) {
    		this.singn = singn;
    	}
    	private String email;
    	private String nocname;
    	private String password;
    	private String head_url;
    	private Date regtime;
    	private String singn;
    }
    

    建立前台的文件包

    我们要在WebContent下建立
    . css:用于放渲染html的代码
    . jsp: 我们写的html文件都要另存为.jsp文件,这样才能有jsp文件转成java文件,然后由java文件编译成.class文件可以运行的文件,也就是为什么每第一次运行servlet都比较慢的原因,因为加载需要这一系列的转换,
    . js: 放JavaScript代码的
    . 注意:这里把html代码放到jsp文件的时候,要保留原来的头代码,删除html代码中的头,比如

    保留

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    

    删除

    最后记得修改html代码中的获取文件代码路径,一定要是服务器的文件下,不要是本地eclipse保存代码的文件,而是tomcat文件下的当前项目下,用EL表达式比较方便,例如 ${pageContext.request.contextPath}/

    测试

    注册一个已经注册的邮箱

    会注册失败的提示重新注册

  • 相关阅读:
    属性选择器
    优先级
    hj_html&css
    hj_解决gpedit.msc不存在的问题
    hj_designPatterns
    hj_ssm
    hj-springmvc
    hj_mybatis
    hj_Python踩坑之旅
    hj_Python学习笔记
  • 原文地址:https://www.cnblogs.com/liu-ya/p/9426047.html
Copyright © 2011-2022 走看看