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);    }}
0 0
原创粉丝点击