javaWeb怎么记录修改的历史

Python016

javaWeb怎么记录修改的历史,第1张

看到这个需求,我第一反应是设计在java层做更新记录好像更方便。不需要任何其他知识点了。

数据库加一张表就行,比如名叫record

表里面 entry property old new date 类似这么几个字段,java层再加一个这个表对应的实体类Record,并且有一个insert方法

在Problem的update方法里,很容易能获取到这几个值,update成功以后创建一个Record对象insert到表里。

这样做的好处是可以收集任意一个实体类的修改记录,可能有User,Person等等。查询的时候根据entry

name这个字段来区分。这样无论多少次修改,都能保存直观的历史记录

至于这样污染了update的代码,你可以思考下依靠spring的aop编程,比如后置通知之类的,将比较新老值,组装成Record对象等逻辑,分离到一个通用、独立的方法里。其实这一点还是需要思考一下,如果才能更优雅地实现。

import java.awt.Color

import java.awt.Dimension

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.sql.ResultSet

import java.sql.SQLException

import java.sql.Statement

import java.util.ArrayList

import java.util.List

import java.util.Vector

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JPanel

import javax.swing.JScrollPane

import javax.swing.JTable

import javax.swing.table.AbstractTableModel

import com.DB

public class TableFromDB extends JFrame{

private TableModel model

public TableFromDB(){

JPanel panel=new JPanel()

panel.setSize(400, 400)

add(panel,"Center")

model= new TableModel()

final JTable t=new JTable(model)

JScrollPane s_pan = new JScrollPane(t)

panel.add(s_pan)

final JButton load=new JButton("Load")

final JButton reset=new JButton("Reset")

panel.add(load)

panel.add(reset)

load.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

List<List>data=getData()

model.removeRows(0, model.getRowCount())

for(int i=0i<data.size()i++){

model.addRow((String)data.get(i).get(1), (String)data.get(i).get(2))

}

t.updateUI()

}

})

reset.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

model.removeRows(0, model.getRowCount())

t.updateUI()

}

})

setSize(500,500)

setDefaultCloseOperation(EXIT_ON_CLOSE)

setVisible(true)

}

public List<List>getData(){

List<List>data=new ArrayList<List>()

DB db = new DB()

String sql = "select * from t_user"

Statement sm = db.getStatement()

int i=0

try {

ResultSet rs = sm.executeQuery(sql)

while(rs.next()){

List detail=new ArrayList()

detail.add(rs.getLong("id"))

detail.add(rs.getString("name"))

detail.add(rs.getString("password"))

data.add(detail)

System.out.println(data.get(i).get(0)+" "+data.get(i).get(1)+" "+data.get(i).get(2))

i++

}

} catch (SQLException e) {

e.printStackTrace()

}

List d1=new ArrayList()

d1.add(1)d1.add("C")d1.add("hello")

List d2=new ArrayList()

d2.add(2)d2.add("Java")d2.add("world")

data.add(d1)

data.add(d2)

return data

}

public static void main(String[] args) {

new TableFromDB()

}

}

class TableModel extends AbstractTableModel{

private Vector content=null

private String[] title_name = { "ID", "name", "password"}

public TableModel(){

content = new Vector()

}

public TableModel(int count){

content = new Vector(count)

}

public void addRow(String name, String password) {

Vector v = new Vector(3)

v.add(0, new Integer(content.size()))

v.add(1, name)

v.add(2, password)

content.add(v)

}

public void removeRow(int row) {

content.remove(row)

}

public void removeRows(int row, int count) {

for (int i = 0i <counti++) {

if (content.size() >row) {

content.remove(row)

}

}

}

public int getColumnCount() {

return title_name.length

}

public int getRowCount() {

return content.size()

}

public Object getValueAt(int row, int col) {

return ((Vector) content.get(row)).get(col)

}

public String getColumnName(int col) {

return title_name[col]

}

public void setValueAt(Object value, int row, int col) {

((Vector) content.get(row)).remove(col)

((Vector) content.get(row)).add(col, value)

this.fireTableCellUpdated(row, col)

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

if (columnIndex == 0) {

return false

}

return true

}

你浏览器是搜狗吧

一: 主体布局是 边界布局,   今天昨天前天是1行1列的网格布局

二:点击今天昨天,明天,中间的组件改变内容,可以使用JTabbedPane (选项卡面板)来实现

当然也可以使用JLabel或者JButton来实现.  只要添加点击事件时,改变中间的组件就可以了

三:蓝色指示标,同样可以在接受点击事件时,改变组件的外观,或者更改背景图片或者绘制一些颜色上去

建议的做法:

如果要一模一样的仿写 那么建议不要使用JTabbedPane 组件. 而是把昨天, 今天 等 做成按钮  .  然后点击的时候, 改变内容

简单的仿写

代码如下

import javax.swing.*

import java.awt.*

public class SwingDemo extends JFrame {

public SwingDemo() {

JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT))

JLabel jl = new JLabel("历史记录")// 文字标签

jl.setFont(new Font("宋体", Font.BOLD, 32))// 设置文字标签的字体

JTextField jtf = new JTextField(8)//文本框,长度8

JButton jb = new JButton("搜索")//按钮

jp.add(jl)

jp.add(jtf)

jp.add(jb)

add(jp, BorderLayout.NORTH)// 把 jp放到北面

JTabbedPane jtp = new JTabbedPane()// 选项卡

JPanel jp0 = new JPanel(new FlowLayout(FlowLayout.LEFT))// 从左到右的流式布局,

JLabel jl1 = new JLabel("今天的历史记录:")

jp0.add(jl1)

jtp.add("今天", jp0)// 选项卡面板添加 标题是 今天, 对应的内容组件是jp0

JTextArea jta = new JTextArea()

jta.append("昨天的历史记录:")

jtp.add("昨天", jta)

JPanel jp1 = new JPanel()

jp1.setBackground(Color.ORANGE)

jtp.add("前天", jp1)

jtp.setTabPlacement(JTabbedPane.LEFT)

add(jtp)

setTitle("主窗口")// 标题

setSize(620, 480)// 大小

setLocationRelativeTo(null)// 居中

setDefaultCloseOperation(EXIT_ON_CLOSE)// 关闭窗口后退出程序

setVisible(true)// 窗口可见

}

public static void main(String[] args) {

new SwingDemo()

}

}