手把手搭建一个完整的javaweb项目(适合新手)

您所在的位置:网站首页 netbeans没有javaweb项目 手把手搭建一个完整的javaweb项目(适合新手)

手把手搭建一个完整的javaweb项目(适合新手)

2024-06-30 13:46:15| 来源: 网络整理| 查看: 265

本篇文章仅供参考。如果您遇到了问题,建议自己使用英文进行google搜索。而不是当一个不经过自己努力和思考的伸手党

本文章以前在CSDN发布:点此查看

2021/02/24更新:仅做参考,建议学习SpringBoot。

说明1:只是实现了简单的操作,但是逻辑并不严谨(比如并没有进行密码的加密,也没有进行对不规范字符串的判断),仅适合新手,望注意。 说明2:这个项目是在我的macbookpro上运行的。windows用户的环境配置可能不一样。望注意 前提:正确建立了一个javaweb项目(web项目建立教程)

开发环境与工具

IntelliJ IDEA 2018.3.3(Ultimate Edition)(Mac版本) Mysql Workbench8.0 jdk11 Tomcat for mac ( 安装教程 )

工具包 添加下包三个jar包,放到lib文件夹中。 jar包链接 密码:rglh 在这里插入图片描述 功能说明

用户登录 新用户注册 用户列表展示 用户信息删除 用户信息更新

操作步骤

在mysql建立一个新表Student,里面有name,password,id(为了简化操作,所以只有三列并且都是String类型) create table if not exists Student (name varchar(10) primary key, password varchar(10) not null, id varchar(10) not null); 插入数据 insert into Student(name,password,id) values("005",123,5); insert into Student(name,password,id) values("004",123,4); insert into Student(name,password,id) values("003",123,3); insert into Student(name,password,id) values("002",123,2); insert into Student(name,password,id) values("001",123,1); 打开intellij新建一个javaweb项目,具体操作参考我的博客 导入连接数据库的jar包,具体操作参考我的博客 intellij导数据库jar包 建立对应的包结构 filter //过滤器,解决中文字符集乱码 util //数据库连接工具类 entity //实体类 dao //数据操作类 servlet //servlet类 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019031619130537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1cm9uZzMzMzMz,size_16,color_FFFFFF,t_70 在filter下新建一个EncodingFilter用来解决中文字符集乱码,它需要实现Filter接口,并重写doFilter函数 package filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //在filter下新建一个EncodingFilter用来解决中文字符集乱码,它需要实现Filter接口,并重写doFilter函数 public class EncodingFilter implements Filter { public EncodingFilter() { System.out.println("过滤器构造"); } public void destroy() { System.out.println("过滤器销毁"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); //将编码改为utf-8 response.setContentType("text/html;"); chain.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException { System.out.println("过滤器初始化"); } } web.xml的全部配置信息 EncodingFilter filter.EncodingFilter EncodingFilter /* loginServlet servlet.loginServlet registerServlet com.servlet.registerServlet showAllServlet servlet.showAllServlet deleteServlet com.servlet.deleteServlet updateServlet servlet.updateServlet loginServlet /loginServlet registerServlet /registerServlet showAllServlet /showAllServlet deleteServlet /deleteServlet updateServlet /updateServlet login.jsp 在util下新建一个DBconnect类用来处理对数据库的连接操作(用户名或密码按照自己的数据库更改) package com.util; import java.sql.*; public class DBconnect { static String url="jdbc:mysql://localhost:3306/DataTest?useSSL=false"; static String user="root"; static String pw = "12345678"; static Connection conn=null; static PreparedStatement ps=null; static ResultSet rs=null; static Statement st=null; public static void init() throws SQLException, ClassNotFoundException {//SQl程序初始化 try{ Class.forName("com.mysql.jdbc.Driver");//注册驱动 conn= DriverManager.getConnection(url, user, pw); //建立连接 }catch (Exception e){ System.out.println("SQL程序初始化失败"); e.printStackTrace(); } } public static int addUpdateDelete(String sql){ int i=0; try{ ps=conn.prepareStatement(sql); boolean flag= ps.execute(); if(flag==false){//如果第一个结果是结果集对象,则返回true;如果第一个结果是更新计数或者没有结果,则返回false i++; } }catch(Exception e){ System.out.println("数据库增删改异常 "); e.printStackTrace(); } return i; } public static ResultSet selectSql(String sql){ try{ ps=conn.prepareStatement(sql); rs=ps.executeQuery(); }catch(Exception e){ System.out.println("数据库查询异常"); e.printStackTrace(); } return rs; } public static void closeConn(){ try{ conn.close(); }catch(Exception e){ System.out.println("数据库关闭异常"); e.printStackTrace(); } } } 在entity下新建一个MyUser实体类(实体即抽象出来的用户对象,对应数据库中的Student表,表中每个字段在实体中为一个属性,也可以理解为一个User对象对应数据库中的Student表一条记录) package entity; public class MyUser { private String name; private String password; private String id; public MyUser(){} public MyUser(String name,String password,String id){ this.name=name; this.password=password; this.id=id; } public String getId() { return id; } public void setId(String id) { this.id = id; } public MyUser(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String username) { this.name = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 在dao下新建一个UserDao接口 以及对应的方法实现类(使用接口类是为了规范开发)

UserDao类

package dao; import java.util.List; import entity.MyUser; public interface UserDao { public boolean login(String name,String password); public boolean register(MyUser user); public List getUserAll();//返回用户信息集合 public boolean delete(String id);//根据id删除 public boolean update(String name, String id); }

UserDaoImplement类

package dao; import entity.MyUser; import util.DBconnect; import java.lang.invoke.MutableCallSite; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDaoImplement implements UserDao { public boolean login(String name, String password) { boolean flag = false; try { try{ DBconnect.init(); }catch (Exception e){ e.printStackTrace(); } //注意查询语句中的单引号双引号 ResultSet rs = DBconnect.selectSql("select * from student where name='" + name + " 'and password='" + password + "';"); while (rs.next()) { if (rs.getString("name").equals(name) && rs.getString("password").equals(password)) { flag = true; } } DBconnect.closeConn(); } catch (SQLException e) { e.printStackTrace(); } return flag; } public boolean register(MyUser user) { boolean flag = false; try{ DBconnect.init(); }catch (Exception e){ e.printStackTrace(); } int i = DBconnect.addUpdateDelete("insert into student(name,password,id) " + "values('" + user.getName() + "','" + user.getPassword() + "','"+user.getId()+" ' )"); if (i > 0) { flag = true; } DBconnect.closeConn(); return flag; } public List getUserAll() {//返回用户信息集合 List list = new ArrayList(); try { try{ DBconnect.init(); }catch (Exception e){ e.printStackTrace(); } ResultSet rs = DBconnect.selectSql("select * from student"); while (rs.next()) { String nameone=rs.getString("name"); String passwordone=rs.getString("password"); String idone=rs.getString("id"); MyUser user=new MyUser(nameone,passwordone,idone); list.add(user); } DBconnect.closeConn(); } catch (SQLException e) { e.printStackTrace(); } return list; } public boolean delete(String id) {//根据id删除{ boolean flag = false; try{ DBconnect.init(); }catch (Exception e){ e.printStackTrace(); } String sql = "delete from student where id='" + id+"'"; int i = DBconnect.addUpdateDelete(sql);//i的意义: if (i > 0) { flag = true; } DBconnect.closeConn(); return flag; } public boolean update(String name, String id) { boolean flag = false; try{ DBconnect.init(); }catch (Exception e){ e.printStackTrace(); } String sql = "update student set name ='" + name +"'"+"where id = '" + id+"'"; int i = DBconnect.addUpdateDelete(sql); System.out.println("1"+" "+i); if (i > 0) { flag = true; } DBconnect.closeConn(); return flag; } } 在servlet下创建loginServlet用来实现对用户登录的操作 package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.UserDao; import dao.UserDaoImplement; public class loginServlet extends HttpServlet { //需要继承HttpServlet 并重写doGet doPost方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); //将信息使用doPost方法执行 对应jsp页面中的form表单中的method } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); //得到jsp页面传过来的参数 String password = request.getParameter("password"); UserDao ud = new UserDaoImplement(); if (ud.login(name, password)) { //request.setAttribute("hello", "欢迎用户" + name); //向request域中放置信息 request.getRequestDispatcher("/success.jsp").forward(request, response);//转发到成功页面 } else { response.sendRedirect("login.jsp"); //重定向到首页 } } } 在servlet下创建一个registerServlet用来实现用户注册的操作 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.text.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.UserDao; import dao.UserDaoImplement; import entity.MyUser; public class registerServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); //获取jsp页面传过来的参数 String pwd = request.getParameter("password"); String id = request.getParameter("id"); MyUser user = new MyUser(); //实例化一个对象,组装属性 user.setName(name); user.setPassword(pwd); user.setId(id); UserDao ud = new UserDaoImplement(); if(ud.register(user)){ request.setAttribute("name", name); //向request域中放置参数 request.getRequestDispatcher("/login.jsp").forward(request, response); //转发到登录页面 }else{ response.sendRedirect("register.jsp");//注册失败则返回注册页面,但是缺少提示"注册失败" } } } 在servlet下创建shouAllServlet用来返回数据库中所有用户信息 package servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.UserDao; import dao.UserDaoImplement; import entity.MyUser; public class showAllServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); UserDao ud = new UserDaoImplement(); List userAll = ud.getUserAll(); request.setAttribute("all", userAll); request.getRequestDispatcher("showAll.jsp").forward(request, response); } } 在servlet下创建updateServlet用来更新用户信息(在此仅仅根据id来更新用户姓名,逻辑性很弱 package servlet; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.text.ParseException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.UserDao; import dao.UserDaoImplement; import entity.MyUser; public class updateServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); String name = request.getParameter("name"); //获取jsp页面传过来的参数 UserDao ud = new UserDaoImplement(); if(ud.update(name, id)){ request.getRequestDispatcher("/addUpdateDeleteSuccess.jsp").forward(request, response); }else{ response.sendRedirect("addUpdateDeleteFail.jsp"); } } }

补充:在servlet下创建deleteServlet用来删除用户信息

package 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 dao.UserDao; import dao.UserDaoImplement; public class deleteServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); UserDao ud = new UserDaoImplement(); if (ud.delete(id)) { request.getRequestDispatcher("addUpdateDeleteSuccess.jsp").forward(request, response); } else { response.sendRedirect("addUpdateDeleteFail.jsp"); } } } 新建各种jsp页面

login.jsp

登录注册页面 用户名: 密码:

success.jsp

My JSP 'success.jsp' starting page 查看所有用户

register.jsp

My JSP starting page 输入姓名: 输入密码: 输入id:

showAll.jsp

所有用户页面 删除

addUpdateDeleteFail.jsp

addUpdatedDeleteFail

addUpdateDeleteFail

addUpdateDeleteSuccess.jsp

addUpdateDeleteSuccess 查看所有用户

操作截图

开启Tomcat,运行login.jsp,展示首页 在这里插入图片描述

输入名字001与密码123,登录成功进入loginServlet,点击查看所有用户,显示用户信息 在这里插入图片描述 在这里插入图片描述

点击删除,若是删除成功则返回所有用户列表,否则返回addUpdateDelete.jsp(这里不展示删除具体的例子)

在首页点击注册,进入注册页面,注册007,注册完成会返回登录页面 在这里插入图片描述

遇到的问题以及解决方式

问题1 在showAll.jsp页面中显示了所有数据库的数据,但是删除或者更改其中的一个数据,再想返回修改数据之后的当前页面,就会出现错误。

问题症结所在:jsp页面回显数据

分析:前端提交数据,主要有两种方式。from表单与ajax异步提交。两种方式都可以提交数据到后台。但是想让后台数据返回当前页面显示的话,在不刷新整个页面的前提下,就需要使用ajax,因为ajax可以实现异步刷新

解决方式:在此转换了一个思路。删除或者更新之后,先跳转到addUpdateDeleteSuccess.jsp,这个jsp界面有个按钮链接可以跳转到showAll.jsp界面,然后再显示所有用户的信息(其实使用ajax解决也是ok的)

问题2:端口1099被占用 解决方式: 1) 在mac终端输入lsof -i tcp:1099,查看是哪个进程占用1099 2) 知道是进程80049占用 输入sudo kill -9 80049,即可解决问题 在这里插入图片描述 问题3: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决: 将数据库连接的jar文件导入到工程的web/WEB-INF/lib中(查询连接https://blog.csdn.net/mayuko2012/article/details/72971997)

问题4:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column...

分析:出现这个异常的很大可能性是 数据库是没有问题的!关键原因是:你从传过来的参数是String类型的,我们在操作数据库时String类型的参数必须要用' '把参数引起来才能传递并接收! 例如rs=stmt.executeQuery("select * from userinfo where userid = '"+ID+"'");ID是String类型,在进行数据库操作时,千万不要漏了两边的单引号,切记 !!!常错点!!!

问题5:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常, 解决:一般都是自己的sql语句写错了(仔细查找错误)。

问题6:org.apache.jasper.JasperException: javax.el.ELException: Failed to parse the expression [${}] 分析:没有jstl标签库 操作:在lib文件夹添加相关的jar。文章开头已给出。

感想

报错的信息,可以直接粘贴,google一下,很多问题都可以找得到答案。 google问题时候,比较考验自己的筛选能力。很多博文写的真的是只有自己能看懂,所以我在找错的时候花了很多的时间 有条件一定要FQgoogle,百度真的是会浪费你的时间。买个一年的服务器也就是百来十块钱,但是自己的时间一定是可以节省很多的。 多上github,StackOverflow,多用google。 有一个bug我改了三天,都变佛系了。改了一天没结果,我就第三天再继续刚。 有个27寸的显示器真的能让你多坐在座位上打码 初级选手的话,数据库的表尽量设计得简单,不然很麻烦 打码更多需要的是耐心与坚持


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭