JavaWeb项目(书城idea)---注册

Posted wybslj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb项目(书城idea)---注册相关的知识,希望对你有一定的参考价值。

一、创建一个项目

1. 创建之后的文件结构

技术图片

2. src文件夹下的结构 项目的后端代码

技术图片

3. web文件夹 放置前端代码

在WEB-INF文件夹下放置我们依赖的jar包。

技术图片技术图片

4. 依赖/导入的jar包

技术图片

 

二、使用环境

  1. win10

  2. Java版本1.8

  3. Tomcat9

  4. mysql8.0以上版本

三、导入所需要的jar包

  1. 创建一个lib文件夹

  2. 把所需要的jar包放入到lib文件夹下

  3. 把lib移动至web文件夹下的WEB-INF文件夹下

  4. 右键点击lib文件夹,as a library

  5. 打开File选项下的Project Structure,看是否导入

具体可以看这篇文章

四、 实现注册功能

1. 建立一个模型(model):在model文件夹下创建User类 里面是用户的私有属性 以及 属性的get、set方法和类的toString方法

参考上文src文件夹结构

在src文件夹下的model文件夹下创建一个User类。 并为每个属性添加get、set方法以及toString()方法

 

技术图片

具体内容:

package com.gyf.bookstore.model;

import java.util.Date;

/**
 * 用户表
 */
public class User 
    private int id; // 编号
    private String username; // 姓名
    private String password; // 密码
    private String gender; // 性别
    private String email; // 邮箱
    private String telephone; // 联系电话
    private String introduce; // 介绍
    private String activeCode; // 激活码
    private String role; // 用户角色
    private int state; // 状态
    private Date registTime; // 注册时间

创建每个属性的get、set方法:alt + insert 看见getter和setter点击 之后ctrl + a全选 点击ok
以及toString()方法:alt+insert 看到toString点击创建

2. dao 操作数据库(c3p0)使用c3p0:首先创建一个xml配置连接mysql的信息,然后在utils文件夹下创建C3P0Util的工具类(主要是连接和关闭和mysql的连接),之后在dao文件夹下创建一个UserDao增删改查(目前之后增加,因为注册用户)

  1. 在src文件夹下创建一个c3p0-config.xml:表示idea怎么连接mysql数据库

<c3p0-config>
    <default-config>
        <!-- 必要参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver(这是mysql8.0以上版本连接)</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore(这是数据库的名称)(请务必加上后面的内容不然后报错)?useSSL=false&amp;serverTimezone=UTC</property>
        <property name="user">mysql(账户)</property>
        <property name="password">mysql(密码)</property>
        <!-- 下面不是必要的参数 -->
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config>
</c3p0-config>

技术图片

 2. 在utils文件夹下创建一个C3P0Utils的工具类

技术图片

 代码如下:

package com.gyf.bookstore.utils;


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;


import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils 
    
    private static DataSource ds  = new ComboPooledDataSource();

    /**
     * 返回数据源(数据池)
     * @return
     */
    
    public static DataSource getDataSource()
        return ds;
    

    /**
     *  返回一个连接
     * @return
     */
    public static Connection getConnection()
        try 
            return ds.getConnection();
         catch (SQLException e) 
            // TODO Auto-generated catch block
            throw new RuntimeException("服务器错误");
        
    
    
    public static void closeAll(Connection conn,Statement statement,ResultSet resultSet)
        
        if(resultSet != null)
            try 
                resultSet.close();
             catch (SQLException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            resultSet = null;
        
        
        if(statement != null)
            try 
                statement.close();
             catch (SQLException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            statement = null;
        
        
        if(conn != null)
            try 
                conn.close();
             catch (SQLException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
                conn = null;
            
        
    

 

 

 3. 在dao文件夹下,创建一个UserDao类,与数据库进行数据交互。

技术图片

 

代码:

package com.gyf.bookstore.dao;

import com.gyf.bookstore.model.User;
import com.gyf.bookstore.utils.C3P0Utils;
import org.apache.commons.dbutils.QueryRunner;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


/**
 * UserDao类
 * 在真正的项目开发中,实现创建一个接口,然后去实现。
 * 这里是为了省时间
 */
public class UserDao 

    /**
     * 添加一个用户
     *
     * @param user
     */
/*    public void addUser(User user) throws SQLException 
        // 1. 获取(使用dbutil)QueryRunner
        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); // 在utils包下的C3P0Utils类下的方法 返回数据源

        // 2. sql语句
        String sql = "insert into user";
        sql += " username,PASSWORD,gender,email,telephone,introduce,activeCode,state,role,registTime)";
        sql += " values(?,?,?,?,?,?,?,?,?,?)";

        // 3. 参数
//        第一种方式
//        Object[] prams = new Object[10];
//        parms[0]*
        // 第二种
        List<Object> list = new ArrayList<Object>();
        list.add(user.getUsername());
        list.add(user.getPassword());
        list.add(user.getGender());
        list.add(user.getEmail());
        list.add(user.getTelephone());
        list.add(user.getIntroduce());
        list.add(user.getActiveCode());
        list.add(user.getState());
        list.add(user.getRole());
        list.add(user.getRegistTime());

        // 4. 执行sql语句
        qr.update(sql,list.toArray());
    */
    public void addUser(User user) throws SQLException 
        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "INSERT INTO user " +
                "(username,PASSWORD,gender,email,telephone,introduce,activeCode,state,role,registTime) " +
                "VALUES (?,?,?,?,?,?,?,?,?,?)";

        qr.update(sql, user.getUsername(), user.getPassword(), user.getGender(),
                user.getEmail(), user.getTelephone(), user.getIntroduce(),
                user.getActiveCode(), user.getState(), user.getRole(), user.getRegistTime());
    

 

3. service 通过这个UserService类 调用userDao的addUser()方法向数据库添加用户

技术图片

代码如下

package com.gyf.bookstore.service;

import com.gyf.bookstore.dao.UserDao;
import com.gyf.bookstore.exception.UserException;
import com.gyf.bookstore.model.User;

import java.sql.SQLException;

public class UserService 

    // 创建DAO
    UserDao userDao = new UserDao();
    public void register(User user) throws UserException 
        try 
            userDao.addUser(user);
         catch (SQLException e) 
            e.printStackTrace();
            throw new UserException("用户注册失败!");
        
    

4. UserServlet  用户通过表单提交的数据在这里被处理。符合要求,注册信息添加到数据库(UserService类中的register添加[register使用了UserDao类里的addUser()方法,addUser用到了C3P0Util类里的方法]),并跳转到注册成功界面。不符合要求,重新返回到注册界面。

技术图片

代码如下:

package com.gyf.bookstore.web.servlet;

import com.gyf.bookstore.exception.UserException;
import com.gyf.bookstore.model.User;
import com.gyf.bookstore.service.UserService;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

@WebServlet("/register")
public class RegisterServlet extends HttpServlet 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        super.doGet(req, resp);
    

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        // 解决乱码问题
        req.setCharacterEncoding("UTF-8"); // 简化:写一个filter拦截请求
        // 1. 把参数转成Bean model
        User user = new User();
        try 
            BeanUtils.populate(user, req.getParameterMap());
            System.out.println(user);

            // 给无数据的属性赋值
            user.setActiveCode(UUID.randomUUID().toString()); //激活码
            user.setRole("普通用户"); //角色
            user.setRegistTime(new Date());
            System.out.println(user);

            // 2. 注册
            UserService us = new UserService();
            us.register(user);

            // 3. 返回结果
            //3.1 成功-成功页面
            req.getRequestDispatcher("/registersuccess.jsp").forward(req,resp);


        catch (UserException e)
            e.printStackTrace();
            //3.2 失败-注册页面
            req.setAttribute("register_error",e.getMessage()+"用户名不存在");
            req.getRequestDispatcher("/register.jsp").forward(req,resp);
         catch (Exception e)
            System.out.println("参数转模型失败......");
            e.printStackTrace();
        
//         catch (IllegalAccessException e) 
//            e.printStackTrace();
//         catch (InvocationTargetException e) 
//            e.printStackTrace();
//        




    

 

目前,就接触到这种程度。此外还在  src文件下  的  exception文件夹  下创建 一个UserException 用来在 UserService类 调用 dao文件夹 下的 UserDao类的addUser()方法时,显示是否插入成功。

还有filter文件夹下的,解决中文乱码问题的MyEncodingFilter类。

技术图片

代码如下:UserException

package com.gyf.bookstore.exception;

/**
* 自定义异常类
*/
public class UserException extends Exception // Exception 编译异常 RuntimeException 运行异常

/**
* Constructs a new exception with the specified detail message. The
* cause is not initialized, and may subsequently be initialized by
* a call to @link #initCause.
*
* @param message the detail message. The detail message is saved for
* later retrieval by the @link #getMessage() method.
*/
public UserException(String message)
super(message);

MyEncodingFilter.java

package com.gyf.bookstore.web.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

class MyRequest extends HttpServletRequestWrapper

    HttpServletRequest request;
    public MyRequest(HttpServletRequest request) 
        super(request);
        this.request = request;
    
    
    @Override
    public String getParameter(String name) 
        // TODO Auto-generated method stub
        String[] values = getParameterMap().get(name);
        if(values != null)
            return values[0];
        
        return null;
    
    @Override
    public String[] getParameterValues(String name) 
        // TODO Auto-generated method stub
        return getParameterValues(name);
    
    @Override
    public Map<String, String[]> getParameterMap() 
        
        String method = request.getMethod();
        if(method.equalsIgnoreCase("post"))//post请求
            try 
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
             catch (UnsupportedEncodingException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        else if(method.equalsIgnoreCase("get"))//如果是tomcat8版本以上的就不用写这个了
            // TODO Auto-generated method stub
            Map<String, String[]>  map =  request.getParameterMap();
            //遍历,然后解码回UTF-8
            /*for(Entry<String, String[]> entry : map.entrySet())
                String[] values = entry.getValue();
                for(int i=0;i<values.length;i++)
                    try 
                        values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");
                        System.out.println(values[i]);
                     catch (UnsupportedEncodingException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                
            */
            
            
            return map;
        
        
        return super.getParameterMap();
        
    

 

技术图片

 

以上是关于JavaWeb项目(书城idea)---注册的主要内容,如果未能解决你的问题,请参考以下文章

基于 JavaWeb 的尚书房网上书城项目

尚书房网上书城JavaWeb项目

JavaWeb图书商城 网上书城

JavaWeb书城项目遇到的一些问题

[JavaWeb]文件上传下载和书城项目

项目01-JavaWeb网上书城01之工具类