MVC设计模式和Serverlet

本文介绍了MVC设计模式的原理,强调了其将业务模型与用户界面分离的优势。接着,讨论了数据库事务的概念,指出事务在确保数据库操作一致性中的重要作用。最后,探讨了Servlet的使用,包括在Apache Tomcat服务器上的部署以及如何处理网页交互,特别是解决编码差异问题。

MVC设计模式

MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
这里写图片描述

这是M,即数据类,是一个业务模型,在这里是建立数据库,并与数据库建立连接
package com.lingzhuo.sqlmvc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlManger {
    private Connection connection;
    private Statement state;
    public Connection getConnection() {
        return connection;
    }
    public void setConnection(Connection connection) {
        this.connection = connection;
    }
    public Statement getState() {
        return state;
    }
    public void setState(Statement state) {
        this.state = state;
    }
    private static SqlManger manger;
    public static synchronized SqlManger newInstance(){
        if(manger==null){
            manger=new SqlManger();
        }
        return manger;
    }
    private SqlManger(){
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/clazz";
        String user = "root";
        String password = "1639189";
        try {
            Class.forName(driver);
            connection=DriverManager.getConnection(url,user,password);
            state=connection.createStatement();//数据库操作类
            String userTable = "create table if not exists user(id int(10)not null primary key auto_increment,name varchar(20)binary not null,password varchar(20)binary not null)";
            state.execute(userTable);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
这是一个控制类,通过数据库的模型对数据库进行操作
package com.lingzhuo.sqlmvc;

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

public class RegisterControl {

    public void register(String username, String password) {
        // TODO Auto-generated method stub
        Statement state=SqlManger.newInstance().getState();
        String insert = "insert into user(name,password)values('" + username + "','" + password+ "')";
        try {
            state.execute(insert);
                System.out.println("注册成功");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}
只是最终的显示给客户的类,用来最终输入数据,显示数据
package com.lingzhuo.sqlmvc;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Register extends JFrame {

    private JPanel contentPane;
    private JTextField textFielduser;
    private JTextField textFieldpass;

    /**
     * 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, 247, 301);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        textFielduser = new JTextField();
        textFielduser.setBounds(95, 37, 126, 33);
        contentPane.add(textFielduser);
        textFielduser.setColumns(10);

        textFieldpass = new JTextField();
        textFieldpass.setBounds(95, 102, 126, 33);
        contentPane.add(textFieldpass);
        textFieldpass.setColumns(10);

        JButton btnNewButton = new JButton("注册");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String userName=textFielduser.getText();
                String password=textFieldpass.getText();
                (new RegisterControl()).register(userName, password);
            }
        });
        btnNewButton.setBounds(89, 170, 93, 23);
        contentPane.add(btnNewButton);

        JLabel label = new JLabel("用户名");
        label.setBounds(23, 46, 54, 15);
        contentPane.add(label);

        JLabel label_1 = new JLabel("注册密码");
        label_1.setBounds(23, 111, 54, 15);
        contentPane.add(label_1);
    }
}

事物

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

package com.lingzhuo.shiwu;

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

public class MySql {
    public static void main(String[] args) {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/clazz";
        String user = "root";
        String password = "1639189";
        try {
            Class.forName(driver);
            Connection conn=DriverManager.getConnection(url,user,password);
            Statement state=conn.createStatement();
            String create="create table if not exists teacher(id int(10)not null primary key auto_increment,name varchar(20)not null)";
            state.execute(create);
            conn.setAutoCommit(false);
            String insert1="insert into teacher(name)values('zhangsan')";
            String insert2="insert into teacher(name)values('lisi')";
            String insert3="insert into teachers(name)values('wangwu')";
            String insert4="insert into teacher(name)values('zhaoliu')";
            state.execute(insert1);
            state.execute(insert2);
            state.execute(insert3);
            state.execute(insert4);
            conn.commit();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

在上述代码中,有四行语句是执行四个数据库插入操作,本来这四句是顺序执行,如果第三行出现错误,前两行的执行结果将会被保存,但是事物模式中,如果一旦某一环节出现错误,所有环节都会返回到上一状态,专业术语叫做回滚。

Serverlet

先安装ApacheTomcat网络服务器,然后使用ecalips javaEE版本来对服务器进行测试。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a>hello,world</a>此处可以放置某个网页的代码段
</body>
</html>

这里写图片描述
通过serverlet和网页进行交互,来模拟客户端和服务器上传下载文件。

package com.lingzhuo.tomcat;

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 MyServerlet
 */
@WebServlet("/MyServerlet")
public class MyServerlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServerlet() {
        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 username=request.getParameter("username");
        String password=request.getParameter("password");
        String name=Encoding.doEncoding(username);
        System.out.println("用户名:"+name+"  密码:"+password);
        response.setHeader("Content-type", "text/heml;charset=UTF-8");
        response.getWriter().append("用户名:"+name+"  密码:"+password).append(request.getContextPath());
    }

    /**
     * @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);
    }

}

由于网页的编码方式和eclipse中的编码方式不一样,这里另建了一个类来进行编码方式的转化。

package com.lingzhuo.tomcat;

import java.io.UnsupportedEncodingException;

public class Encoding {
    public static String doEncoding(String str){
        byte[] array;
        try {
            //将浏览器传过来的ISO-8859-1格式的信息转化为字节数组
            array = str.getBytes("ISO-8859-1");
            //将自己数组的信息转化为UTF-8格式的String类型
            str=new String(array,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        return str;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值