8月11日----数据库、serverlet
来源:互联网 发布:mac改用户名 编辑:程序博客网 时间:2024/05/22 00:48
数据库的补充
MVC设计模式
MVC:Model View Controller 是一种编程思想 ,把图形界面和方法分开 便于后期的维护和更改
把昨天的登录和注册程序用MVC模式写:
//login 登录package com.lingzhuo.test;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JLabel;import javax.swing.JTextField;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;public class Login extends JFrame { private JPanel contentPane; private JTextField textField; private JTextField textField_1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Login frame = new Login(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Login() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("用户名"); label.setBounds(57, 57, 54, 41); contentPane.add(label); JLabel label_1 = new JLabel("密码"); label_1.setBounds(57, 126, 54, 53); contentPane.add(label_1); textField = new JTextField(); textField.setBounds(118, 67, 169, 31); contentPane.add(textField); textField.setColumns(10); textField_1 = new JTextField(); textField_1.setBounds(121, 137, 166, 31); contentPane.add(textField_1); textField_1.setColumns(10); JButton btnNewButton = new JButton("登录"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String userName = textField.getText(); String passWord = textField_1.getText(); Boolean is =SQLOperation.newInstence().signIn(userName, passWord); if(is){ System.out.println("登陆成功"); } } }); btnNewButton.setBounds(143, 205, 93, 23); contentPane.add(btnNewButton); }}//注册package com.lingzhuo.test;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JTextField;import javax.swing.JLabel;import javax.swing.JButton;import java.awt.event.ActionListener;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.awt.event.ActionEvent;public class Register extends JFrame { private JPanel contentPane; private JTextField textField; private JTextField textField_1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Register frame = new Register(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Register() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); textField = new JTextField(); textField.setBounds(167, 45, 118, 34); contentPane.add(textField); textField.setColumns(10); JLabel label = new JLabel("用户名"); label.setBounds(80, 44, 77, 34); contentPane.add(label); textField_1 = new JTextField(); textField_1.setBounds(167, 104, 118, 34); contentPane.add(textField_1); textField_1.setColumns(10); JLabel label_1 = new JLabel("密码"); label_1.setBounds(80, 104, 77, 34); contentPane.add(label_1); JButton btnNewButton = new JButton("注册"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String userName = textField.getText(); textField.setText(""); String passWord = textField_1.getText(); textField_1.setText(""); boolean is = SQLOperation.newInstence().zhuce(userName, passWord); if(is){ System.out.println("注册成功"); }else{ System.out.println("注册失败"); } } }); btnNewButton.setBounds(167, 184, 118, 47); contentPane.add(btnNewButton); }}//登录和注册的方法Operationpackage com.lingzhuo.test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class SQLOperation { //单例设计模式 private static SQLOperation operator; private SQLOperation(){ } public static synchronized SQLOperation newInstence(){ if(operator==null){ operator = new SQLOperation(); } return operator; } /** * 登录的方法 * @param userName用户名 * @param passWord密码 * @return 返回值为true登录成功,反之为失败 */ public boolean signIn(String userName,String passWord){ Connection con = MySQL.newInstance().getCon(); try { if(!con.isClosed()){ PreparedStatement prepare = con.prepareStatement("select * from user where username = ? and password=?"); prepare.setString(1, userName); prepare.setString(2, passWord); ResultSet set = prepare.executeQuery(); set.last(); int num = set.getRow(); System.out.println("result "+num); return num==1; } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return false; } /** * 注册方法 * @param userName用户名 * @param passWord密码 * @return 返回为true是注册成功 */ public boolean zhuce (String userName, String passWord){ Statement stat = MySQL.newInstance().getSql(); String sel = "select * from user where username='" + userName + "'"; try { ResultSet set = stat.executeQuery(sel); // set.first(); set.last(); // int num = set.getInt(1); int num = set.getRow(); if (num > 0) { System.out.println("用户名已存在"); } else { String zhuce = "insert into user (username,password) values('" + userName + "','" + passWord + "')"; stat.execute(zhuce);// System.out.println("注册成功"); return true; } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return false; }}//创建数据库与数据库建立连接package com.lingzhuo.test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;//单例设计模式(确保下面的程序只运行一遍)(只创建一个对象也就是说每次new的时候都是new的同一个对象)public class MySQL { private Statement sql; private Connection con; public Connection getCon() { return con; } public void setCon(Connection con) { this.con = con; } public Statement getSql() { return sql; } public void setSql(Statement sql) { this.sql = sql; } private static MySQL mysql; public static synchronized MySQL newInstance(){ if(mysql==null){ mysql = new MySQL(); } return mysql; } private MySQL() { // TODO Auto-generated constructor stub String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/clazz"; String user = "root"; String password = "123456"; try { Class.forName(driver); con = DriverManager.getConnection(url,user,password); if(!con.isClosed()){ sql = con.createStatement(); String creat = "create table if not exists user (username varchar(30) binary not null primary key, password varchar(30))"; sql.execute(creat); }else{ System.out.println("请打开数据库"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
其实程序与昨天是一样的,只不过把Login和Register中的登录和注册的方法提出来写到一个类中,这样方便以后的更改
事务
事务(一组不可拆分的操作)
例:银行ATM提款 输入金额-服务器-播放录音-打开取钱口-吐钱-
拿钱 //中间任何环节出错全部重来(回滚)
//数据库连接默认每一条语句都是一个事务,会单独执行
//事务:步骤
首先设置connection不自动提交然后执行代码
con.setAutoCommit(false);
con.commit();
例:
package com.lingzhuo.test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class ShiwuTest { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/clazz"; String user = "root"; String password = "123456"; try { Class.forName(driver); Connection con = DriverManager.getConnection(url, user, password); if(!con.isClosed()){ Statement stat = con.createStatement(); String creat = "create table if not exists test (id int(10) not null primary key auto_increment, name varchar(30),age int (5))"; stat.execute(creat); String insert1 = "insert into test (name,age) values ('zhangsan',23)"; String insert2 = "insert into test (name,age) values ('zhangsan1',23)"; String insert3 = "insert into test (name,ages) values ('zhangsan2',23)"; String insert4 = "insert into test (name,age) values ('zhangsan3',23)"; //普通的执行,每一条语句都是一个事务,会单独执行 stat.execute(insert1); stat.execute(insert2); stat.execute(insert3); stat.execute(insert4);
执行结果:zhangsan和zhangsan1成功插入表中到zhangsan2是报错
//下面是使用事务来写,把四个stat.execute()当成同一个事务,其中有一条出错,就回滚//执行结果就是一条数据都没插进去 //接上面的程序 con.setAutoCommit(false); stat.execute(insert1); stat.execute(insert2); stat.execute(insert3); stat.execute(insert4); con.commit();//其中的stat.execute()语句时分条执行的,把它改成下面的语句时就会批量执行 stat.addBatch(insert1); stat.addBatch(insert2); stat.addBatch(insert3); stat.addBatch(insert4); stat.executeBatch();//批量执行 } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
Tomcat的使用
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。
简单来说它的作用就是创建serverlet来给前端传数据
eclipse下配置Tomcat:
http://jingyan.baidu.com/article/ca2d939dd90183eb6d31ce79.html
创建一个Dynamic Web Project,然后在你建好的Project下的WebContent下建立一个HTML文件,然后可以在里面写自己的网页,写好后Run On Server 后就可以看到你自己的网页,也可以在浏览器上查看,地址为:http://localhost:8088/Project的名字/网页的名字.html
创建一个新的serverlet: 在Java Resources下新建一个包,包下新建一个类serverlet,可以使用浏览器提交数据
使用浏览器提交数据是会出现编码格式不对的问题,解决步骤为:
代码:
//解决编码格式的问题package com.lingzhuo.test;import java.io.UnsupportedEncodingException;public class Encoding { public static String doEncoding (String string){ try { string = new String(string.getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return string; }}
package com.lingzhuo.test;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;/** * Servlet implementation class ServletTest */@WebServlet("/ServletTest")public class ServletTest extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletTest() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String name = request.getParameter("name"); String password = request.getParameter("password"); name= Encoding.doEncoding(name); password = Encoding.doEncoding(password);//得到用户名和密码 System.out.println(name+" "+password); response.setHeader("Content-type", "text/html;charset=UTF-8"); response.getWriter().append("用户名: "+name+"密码: "+password);//将得到的数据返回到浏览器 } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
- 8月11日----数据库、serverlet
- 8月10日----数据库
- 11月8日
- 08-11 数据库、方法封装 Serverlet、doGet方法
- 08-11 数据库、方法封装 Serverlet、doGet方法
- 8月11日 Oracle
- 8月11日 MySQL
- 8月11日总结
- 11月8日 笔记
- 8月11日集训
- 8月11日小结
- 8月11日总结
- <note>8月11日
- 11月8日笔记
- serverlet
- 2010年8月11日 ——Oracle数据库日常维护
- 2016年11月30日 数据库mysql 8个小时自动断开
- 11月29日--数据库内容以及代码相关问题
- this 指针
- 正则表达式
- HDU 5372 Segment Game
- UITouch
- Unity2D学习笔记(二):sprite动画编辑
- 8月11日----数据库、serverlet
- socket bind failed解决方案
- 如何成为一名卓越的前端工程师
- light oj 1021 状态压缩dp
- ZOJ2836 Number Puzzle【容斥原理】
- hdu 5373 the shortest problem
- 排序算法总结
- Ubuntu 15 VPN连接失败
- 浅谈MongoDB