本篇以数据库添加为例(本例中数据库名为“xinxi”表单名字为“stud”)

准备---实体层:

package entity;

public class Student {
private String name;
private String adress;
private String qq;
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setAdress(String adress) {
this.adress=adress;
}
public String getAdress() {
return adress;
}
public void setQq(String qq) {
this.qq=qq;
}
public String getQq() {
return qq;
}
public Student() {
}
public Student(String n,String a,String q) {
name=n;
adress=a;
qq=q;
}
}

准备---连接数据库:

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class Shujuku {
public static Connection conn(){
String url="jdbc:sqlserver://localhost:1433;DatabaseName=xinxi";//填写你的数据库名
String userName="sa";//填写你的用户名,我的是sa
String userPwd="********";//填写你的密码
Connection connection=null; try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("加载驱动成功!"); }catch(Exception e){ e.printStackTrace(); System.out.println("加载驱动失败!");
}
try{
connection=DriverManager.getConnection(url,userName,userPwd);
System.out.println("连接数据库成功!");
}catch(Exception e){
e.printStackTrace();
System.out.print("SQL Server连接失败!");
}
return connection;
}
public static void close (Statement state, Connection conn) {//关闭
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} public static void close (ResultSet rs, Statement state, Connection conn) {//关闭
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
 

1.servlet(首先StuService ts=new StuService();//新建service实体对象,以便后来调用service中add()方法

package servlet;
import service.*;
import java.io.IOException;
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 entity.*;
@WebServlet("/StuServlet")
public class StuServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
String method = request.getParameter("method");
if(method.equals("add"))
{
add(request,response);
}
}
StuService ts=new StuService();
private void add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");//从jsp中获取参数name
String adress=req.getParameter("adress");
String qq=req.getParameter("qq");
Student stu=new Student(name,adress,qq);//新建
int k=ts.add(stu);
if(k==2) {
req.setAttribute("message", "添加成功");//setAttribute方法用于将内容保存在对象中,传到add.jsp中
req.getRequestDispatcher("add.jsp").forward(req,resp);//getRequestDispatcher方法用于进入下一个页面
}
if(k==0)
{
req.setAttribute("message", "重复,请重新录入");
req.getRequestDispatcher("add.jsp").forward(req,resp);
}
if(k==1)
{
req.setAttribute("message", "数据库添加失败");
req.getRequestDispatcher("add.jsp").forward(req,resp);
}
}
}

①创建方法add(),Servlet从jsp中获取参数,新建实体对象Student stu=new Student(name,adress,qq);

②调用service层,检验添加的准确性

StuService ts=new StuService();//新建service对象

if(ts.add(stu)){

//如果service对象ts的Boolean add(stu)方法返回真值true,页面要显示添加成功

//req.setAttribute("message", "添加成功");将"添加成功"内容保存在req对象参数message中,传递给add.jsp

//req.getRequestDispatcher("add.jsp").forward(req,resp);进入下一个界面(这里是add.jsp)

}

else{

//收到返回值为false,添加失败

//将 "重复,请重新录入"内容保存在req对象参数message中,传递给add.jsp

//进入下一个界面(这里是add.jsp)

}

2. Service(新建dao实体对象,后面要调用dao层方法

package service;

import dao.StuDao;
import entity.Student; public class StuService {
StuDao sdao=new StuDao();
public int add(Student stu) {
int f=0;
if(!sdao.rename(stu.getName())) {
f=1;
if(sdao.add(stu))
f=2;
}
return f;
}
}

①创建 add(Student stu){}方法,检验添加的准确性

②调用dao层后台程序方法rename()检验是否重名

if(!sdao.rename(stu.getName())) {//如果没有重复

sdao.add(stu);//添加

f=true;//返回真值

}

如图,直接在提示错误中点击创建方法即可

3. Dao(后台程序)

在这里编写所需的底层程序:

rename()//验证名字是否唯一

Add()//添加

public class StuDao {

    public boolean rename(String name) {
// 检验名字是否重复
boolean f=false;
String sql="select name from stud where name='"+name+"'";//数据库语句,查询界面输入和表stud中name是否重复
Connection conn = Shujuku.conn();//创建连接
Statement state = null;//建立Statement对象,执行静态SQL语句
ResultSet rs = null;//ResultSet对象 是查询数据库时的返回对象,读取返回结果集 try {
state = conn.createStatement();
rs = state.executeQuery(sql);
while (rs.next()) {//不重复,返回true
f = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Shujuku.close(rs, state, conn);
}
return f;
} public boolean add(Student stu) {
//添加
String sql = "insert into stud(name,adress,qq) values('" +stu.getName() + "','" + stu.getAdress() + "','" + stu.getQq() + "')";
Connection conn = Shujuku.conn();
Statement state = null;
boolean f = false;
int a=0;
try {
state = conn.createStatement();
a=state.executeUpdate(sql);//添加
} catch (Exception e) {
e.printStackTrace();
} finally {
Shujuku.close(state, conn);
}
if (a > 0) {
f = true;
}
return f;
}
}

4. Add.jsp

编写前端页面;

应用javascript验证客户端表单合法性。

<%@ 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>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Object message = request.getAttribute("message");
if(message!=null && !"".equals(message)){ %>
<script type="text/javascript">
alert("<%=request.getAttribute("message")%>");
</script>
<%} %>
<div align="center">
<h1 style="color: red;">信息录入</h1>
<a href="index.jsp">返回主页</a>
<form action="StuServlet?method=add" method="post" onsubmit="return check()">
<div >
姓名<input type="text" id="name" name="name"/>
</div>
<div >
联系方式<input type="text" id="qq" name="qq" />
</div>
<div >
地址<input type="text" id="adress" name="adress" />
</div>
<div >
<button type="submit" >保&nbsp;&nbsp;&nbsp;存</button>
</div>
</form>
</div>
<script type="text/javascript">
function check() {
var name = document.getElementById("name");;
var qq = document.getElementById("qq");
var adress = document.getElementById("adress"); //非空
if(name.value == '') {
alert('名字为空');
name.focus();
return false;
}
if(qq.value == '') {
alert('联系方式为空');
qq.focus();
return false;
}
if(adress.value == '') {
alert('地址为空');
adress.focus();
return false;
}
}
</script>
</body>
</html>

 

新手详解JAVA+数据库+JSP完成简单页面的更多相关文章

  1. [转帖]详解oracle数据库唯一主键SYS_GUID()

    详解oracle数据库唯一主键SYS_GUID() https://www.toutiao.com/i6728736163407856139/ 其实 需要注意 这里满不能截取 因为截取了 就不一定唯一 ...

  2. 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性

    文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...

  3. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  4. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的

    本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...

  5. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  6. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  7. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  8. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

    windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.ne ...

  9. 超全详解Java开发环境搭建

    摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建   在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...

随机推荐

  1. 在浏览器中输入 www.baidu.com 后执行的全部过程

    现在假设如果我们在客户端(客户端)浏览器中输入http://www.baidu.com,而baidu.com为要访问的服务器(服务器),下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作: ...

  2. Python把两个列表合成一个字典

    简单粗暴上代码 A= [] B = [] C= dict(map(lambda x,y:[x,y],A,B)) 酱紫,就合成了一个字典

  3. Ubuntu将网卡名称eno160改为eth0并且设置静态IP

    修改配置文件/etc/default/grub GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" 设置生效 update-grub ...

  4. WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)

    前言: 本文是基本原理介绍和手动的操作.程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载. 今天在 ...

  5. 使用commons-net做FTP功能的异常 java.lang.ClassNotFoundException: org.apache.oro.text.regex.Malformed

    最近使用Apache的commons-net.jar做FTP上传下载功能,点击“上传”的时候报错,如下: java.lang.ClassNotFoundException: org.apache.or ...

  6. TOP100summit2017:Riot Games 李仁杰——大数据落地要找到数据和经验的平衡点

      壹佰案例:李仁杰老师您好,很荣幸您能参加第六届TOP100全球软件案例研究峰会,您在大数据和人工智能领域有非常丰富的经验,在这次大会上您将分享什么内容? 李仁杰:这次我主要分享的有两个方面. 一个 ...

  7. Codeforces 1108D - Diverse Garland - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/1108/D time limit per test 1 secondmemory limit per te ...

  8. linux虚拟机设置本地yum源

    1.挂载ISO镜像 2.创建文件夹,用于挂载光盘,mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom 3.修改 repo 文件 baseurl=file:///挂 ...

  9. 从urllib2的内存泄露看python的GC python引用计数 对象的引用数 循环引用

    这里会发现上述代码是存在内存泄露,造成的原因就是lz与ow这两个变量存在循环引用,Python 不知道按照什么样的安全次序来调用对象的 __del__() 函数,导致对象始终存活在 gc.garbag ...

  10. 使用double无法得到数学上的精确结果的原因及为何不能用double来初始化BigDecimal

    使用double无法得到数学上的精确结果的原因: double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方) ...