打開IntelliJ IDEA開發工具、點擊Create New Project建立一個新的Web項目css
選擇Java Enterprice(Java企業級開發)、選擇項目使用的JDK、Java EE版本、若是沒有Tomcat則須要配置,請看個人另外一篇博客:html
《IDEA整合Tomcat與操做技巧》、選擇Web應用、點擊下一步Next前端
輸入項目名稱與項目路徑、注意儘可能避免中文路徑java
點擊Finish完成後的結果以下圖所示:mysql
若是對Tomcat有特別的要求則須要進一步配置,能夠參考tomcat配置一文,連接在上面已給出。jquery
項目中須要依賴許多的包,包含:JSTL、MySQL驅動、JUnit等git
Apache Tomcat JSTL 獲取:程序員
官方下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ajax
先打開項目結構,ctrl+alt+shift+s是快捷鍵sql
點擊Libraries(庫)、添加、Java
選擇包所在的位置
將包添加到項目的Lib目錄中,不然在部署時不會被引用
點擊Fix修正後的結果以下
依賴包的方法就是這樣了,依賴其它包的方法是同樣的。
這個綜合應用中須要使用到兩個表,SQL腳本以下:
腳本:
#建立商品類型表 [] CREATE TABLE `category` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '編號', `name` varchar(128) NOT NULL COMMENT '類型名稱', `parentId` int(11) unsigned DEFAULT NULL COMMENT '父節點編號', PRIMARY KEY (`id`), UNIQUE KEY `un_category_name` (`name`), KEY `fk_category_parentId` (`parentId`), CONSTRAINT `fk_category_parentId` FOREIGN KEY (`parentId`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='商品分類'; #建立商品表 drop table if exists goods; #刪除表 create table if not exists goods ( `id` int not null primary key auto_increment comment '編號', `title` varchar(128) not null unique key comment '商品名稱', `category_id` int unsigned COMMENT '商品類型編號', `add_date` TIMESTAMP default now() comment '上貨時間', `picture` varchar(64) comment '圖片', `state` int default 1 comment '狀態', FOREIGN key (`category_id`) REFERENCES category(`id`) )COMMENT='商品' #修改表,增長列 ALTER table goods add details text COMMENT '詳細介紹'; ALTER table goods add price DECIMAL(11,2) COMMENT '價格'; #添加記錄,單行 insert into goods(title,category_id,picture,price,details,state) VALUES('魅族魅藍note1 ',4,'pic(1).jpg',999,'好手機',default); #添加記錄,多行 insert into goods(title,category_id,picture,price,details) select '魅族魅藍note2',4,'pic(2).jpg',889,'好手機' UNION select 'iphone X',4,'pic(3).jpg',5889,'好手機' UNION select '龍蝦',1,'pic(4).jpg',9.85,'好吃' #查詢 select * from goods #備份 SELECT goods.id, goods.title, goods.category_id, goods.add_date, goods.picture, goods.state, goods.details, goods.price FROM goods select SYSDATE(); SELECT now(); #11 mssql不支持limit語句,是很是遺憾的,只能用top 取代limt 0,N,row_number() over()函數取代limit N,M limit是mysql的語法 select * from table limit m,n 其中m是指記錄開始的index,從0開始,表示第一條記錄 n是指從第m+1條開始,取n條。 select * from tablename limit 2,4 即取出第3條至第6條,4條記錄 select * from goods LIMIT 5,3; select * from goods LIMIT 0,3; #至關於 select * from goods limit 0,5 select * from goods limit 5,-1 select * from goods limit 2,(select count(*)-2 from goods) #index 1 第幾頁,頁號 #size 3 每頁記錄數 skip=(index-1)*size, take=size 1 0,3 2 3,3 3 6,3 4 9,3 select * from goods insert into goods( goods.title, goods.category_id, goods.picture, goods.state, goods.details, goods.price) SELECT CONCAT(title,'_',id*8), id%4+1, CONCAT('pic(',id,'.jpg'), id%2, CONCAT('詳細:,很是好,給你點',id,'個贊'), goods.price+id*8 FROM goods select CONCAT('a','b','c'); #枚舉類型 ENUM是枚舉類型,它雖然只能保存一個值,卻可以處理多達65535個預約義的值。下面是我寫的一個mysql語句 drop table student CREATE TABLE student( id INT(11) PRIMARY key auto_increment, name VARCHAR(10) not null, sex ENUM('boy','girl','secret') DEFAULT 'secret', addDate timestamp DEFAULT now(), )ENGINE=INNODB 表的數據結構是: 若是sex列中插入了除bor,girl,secret以外的其它字符,則視爲空字符串 insert into student(name,sex) values('tom','boy'); select * from student; insert into student(name,sex) values('tom','male'); insert into student(name,sex) values('tom','female'); insert into student(name,sex) values('tom',DEFAULT); #添加記錄 insert into student set name='rose',sex='girl' insert into student(name,sex) values ('jack','boy'),('lili','girl'),('candy',default) select now(); select SYSDATE(); select CURRENT_DATE select CURRENT_TIMESTAMP select cur_date() #MicroSoft SQL Server select DISTINCT details from goods; BEGIN declare @cnt INTEGER; set @cnt:=100; select @cnt; end begin declare cnts int; end begin delimeterDECLARE xname VARCHAR(5) DEFAULT 'bob'; DECLARE newname VARCHAR(5); DECLARE xid INT; end; begin declare @cnts int; call ups_getCntByPrice 1000,@cnts out; end; delimiter ; BEGIN declare @cnts int; end; declare declare var1 int default 0; end; select `add`(100,100); select title,`add`(price,100) from goods; select now(); select Md5(Md5(輸入))=='003d712c491c59a86b7ad2207892c704'; select Md5('xx520'); select max(price) into @maxprice from goods; select @maxprice set @maxprice:=999; select @maxprice;
查詢結果:
得到表的定義信息(DDL):
根據DDL建立類,先新建一個包:
建立一個實體類:
右鍵Generate(生成)屬性與重寫toString方法,快捷鍵是:alt+insert
完成的實體類以下:
package com.zhangguo.mall.entities; import java.math.BigDecimal; import java.util.Date; /** * 商品實體 */ public class Goods { /**編號*/ private int id; /**商品名稱*/ private String title; /**商品類型編號*/ private int category_id; /**上貨時間*/ private Date add_date; /**圖片*/ private String picture; /**狀態*/ private int state; /**詳細介紹*/ private String details; /**價格*/ private BigDecimal price; public int getId() { return id; } public Goods setId(int id) { this.id = id; return this; } public String getTitle() { return title; } public Goods setTitle(String title) { this.title = title; return this; } public int getCategory_id() { return category_id; } public Goods setCategory_id(int category_id) { this.category_id = category_id; return this; } public Date getAdd_date() { return add_date; } public Goods setAdd_date(Date add_date) { this.add_date = add_date; return this; } public String getPicture() { return picture; } public Goods setPicture(String picture) { this.picture = picture; return this; } public int getState() { return state; } public Goods setState(int state) { this.state = state; return this; } public String getDetails() { return details; } public Goods setDetails(String details) { this.details = details; return this; } public BigDecimal getPrice() { return price; } public Goods setPrice(BigDecimal price) { this.price = price; return this; } @Override public String toString() { return "Goods{" + "id=" + id + ", title='" + title + '\'' + ", category_id=" + category_id + ", add_date=" + add_date + ", picture='" + picture + '\'' + ", state=" + state + ", details='" + details + '\'' + ", price=" + price + '}'; } }
封裝經常使用的輔助工具包,如JDBC操做、JSON操做等
JDBCUtils完成數據訪問:
package com.zhangguo.mall.utils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class JDBCUtils { public static String DRIVER = "com.mysql.jdbc.Driver"; public static String URL = "jdbc:mysql://localhost:3306/nfmall?useUnicode=true&characterEncoding=UTF-8"; public static String USER_NAME = "root"; public static String PASSWORD = "uchr@123"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private JDBCUtils() { } /** * Get connection * 得到鏈接對象 * @return */ public static Connection getconnnection() { Connection con = null; try { con = DriverManager.getConnection(URL, USER_NAME, PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return con; } /** * Close connection * 關閉鏈接 * @param rs * @param st * @param con */ public static void close(ResultSet rs, Statement st, Connection con) { try { try { if (rs != null) { rs.close(); } } finally { try { if (st != null) { st.close(); } } finally { if (con != null) con.close(); } } } catch (SQLException e) { e.printStackTrace(); } } /** * Close connection * * @param rs */ public static void close(ResultSet rs) { Statement st = null; Connection con = null; try { try { if (rs != null) { st = rs.getStatement(); rs.close(); } } finally { try { if (st != null) { con = st.getConnection(); st.close(); } } finally { if (con != null) { con.close(); } } } } catch (SQLException e) { e.printStackTrace(); } } /** * Close connection * * @param st * @param con */ public static void close(Statement st, Connection con) { try { try { if (st != null) { st.close(); } } finally { if (con != null) con.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * insert/update/delete * 執行增刪改 * @param sql * @param args * @return */ public static int update(String sql, Object... args) { int result = 0; Connection con = getconnnection(); PreparedStatement ps = null; try { ps = con.prepareStatement(sql); if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject((i + 1), args[i]); } } result = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { close(ps, con); } return result; } /** * query, because need to manually close the resource, so not recommended * for use it * 查詢,根據sql與參數 返回 結果集 * @param sql * @param args * @return ResultSet */ public static ResultSet query(String sql, Object... args) { ResultSet result = null; Connection con = getconnnection(); PreparedStatement ps = null; try { ps = con.prepareStatement(sql); if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject((i + 1), args[i]); } } result = ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return result; } /** * Query a single record * * @param sql * @param args * @return Map<String,Object> */ public static Map<String, Object> queryForMap(String sql, Object... args) { Map<String, Object> result = new HashMap<String, Object>(); List<Map<String, Object>> list = queryForList(sql, args); if (list.size() > 0) { result = list.get(0); } return result; } /** * Query a single record * 返回強類型的單個對象 * @param sql * @param args * @return <T> */ public static <T> T queryForObject(String sql, Class<T> clz, Object... args) { T result = null; List<T> list = queryForList(sql, clz, args); if (list.size() > 0) { result = list.get(0); } return result; } /** * Query a single record * * @param sql * @param args * @return List<Map<String,Object>> */ public static List<Map<String, Object>> queryForList(String sql, Object... args) { List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); Connection con = null; ResultSet rs = null; PreparedStatement ps = null; try { con = getconnnection(); ps = con.prepareStatement(sql); if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject((i + 1), args[i]); } } rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 1; i <= columnCount; i++) { map.put(rsmd.getColumnLabel(i), rs.getObject(i)); } result.add(map); } } catch (SQLException e) { e.printStackTrace(); } finally { close(rs, ps, con); } return result; } /** * Query a single record * 查詢,返回 一個強類型的集合 * @param sql * @param args * @return List<T> */ public static <T> List<T> queryForList(String sql, Class<T> clz, Object... args) { List<T> result = new ArrayList<T>(); Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = getconnnection(); ps = con.prepareStatement(sql); if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject((i + 1), args[i]); } } rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); while (rs.next()) { T obj = clz.newInstance(); for (int i = 1; i <= columnCount; i++) { String columnName = rsmd.getColumnName(i); String methodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1, columnName.length()); Method method[] = clz.getMethods(); for (Method meth : method) { if (methodName.equals(meth.getName())) { meth.invoke(obj, rs.getObject(i)); } } } result.add(obj); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } finally { close(rs, ps, con); } return result; } }
初步完成的Dao,代碼以下
package com.zhangguo.mall.dao; import com.zhangguo.mall.entities.Goods; import com.zhangguo.mall.utils.JDBCUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /**商品數據訪問*/ public class GoodsDao { /**得到全部商品*/ public List<Goods> getAllGoods(){ //要執行的sql String sql="SELECT\n" + "goods.id,\n" + "goods.title,\n" + "goods.category_id,\n" + "goods.add_date,\n" + "goods.picture,\n" + "goods.state,\n" + "goods.details,\n" + "goods.price\n" + "FROM\n" + "goods"; //結果集 ResultSet rs=null; //將要返回的集合 List<Goods> entities=new ArrayList<>(); try{ //經過工具類的query方法得到結果集,執行查詢 rs=JDBCUtils.query(sql); //經過遊標得到單行數據 while (rs.next()){ //實例化單個商品對象 Goods entity=new Goods(); //設置實體的屬性值,從當前行中得到數據 entity.setId(rs.getInt("id")); entity.setTitle(rs.getString("title")); entity.setCategory_id(rs.getInt("category_id")); entity.setAdd_date(rs.getDate("add_date")); entity.setPicture(rs.getString("picture")); entity.setState(rs.getInt("state")); entity.setDetails(rs.getString("details")); entity.setPrice(rs.getBigDecimal("price")); //將實體添加到集合中 entities.add(entity); } } catch (Exception e) { e.printStackTrace(); } finally { //確保能夠關閉對象 JDBCUtils.close(rs); } //返回結果 return entities; } public static void main(String[] args) { GoodsDao dao=new GoodsDao(); System.out.println(dao.getAllGoods()); } }
此時的項目結構與經過main方法測試的結果:
JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma創建,逐漸成爲源於Kent Beck的sUnit的xUnit家族中最爲成功的一個JUnit有它本身的JUnit擴展生態圈。多數Java的開發環境都已經集成了JUnit做爲單元測試的工具。
Junit 測試也是程序員測試,即所謂的白盒測試,它須要程序員知道被測試的代碼如何完成功能,以及完成什麼樣的功能
咱們知道 Junit 是一個單元測試框架,那麼使用 Junit 能讓咱們快速的完成單元測試。
一般咱們寫完代碼想要測試這段代碼的正確性,那麼必須新建一個類,而後建立一個 main() 方法,而後編寫測試代碼。若是須要測試的代碼不少呢?那麼要麼就會建不少main() 方法來測試,要麼將其所有寫在一個 main() 方法裏面。這也會大大的增長測試的複雜度,下降程序員的測試積極性。而 Junit 能很好的解決這個問題,簡化單元測試,寫一點測一點,在編寫之後的代碼中若是發現問題能夠較快的追蹤到問題的緣由,減少迴歸錯誤的糾錯難度。
1.@Test: 測試方法
a)(expected=XXException.class)若是程序的異常和XXException.class同樣,則測試經過
b)(timeout=100)若是程序的執行能在100毫秒以內完成,則測試經過
2.@Ignore: 被忽略的測試方法:加上以後,暫時不運行此段代碼
3.@Before: 每個測試方法以前運行
4.@After: 每個測試方法以後運行
5.@BeforeClass: 方法必須必需要是靜態方法(static 聲明),全部測試開始以前運行,注意區分before,是全部測試方法
6.@AfterClass: 方法必需要是靜態方法(static 聲明),全部測試結束以後運行,注意區分 @After
①測試方法上必須使用@Test進行修飾
②測試方法必須使用public void 進行修飾,不能帶任何的參數
③新建一個源代碼目錄來存放咱們的測試代碼,即將測試代碼和項目業務代碼分開
④測試類所在的包名應該和被測試類所在的包名保持一致
⑤測試單元中的每一個方法必須能夠獨立測試,測試方法間不能有任何的依賴
⑥測試類使用Test做爲類名的後綴(不是必須)
⑦測試方法使用test做爲方法名的前綴(不是必須)
添加junit的依賴包:
在須要測試的代碼中右鍵->generate->JUnit Test->對應版本
編寫測試代碼,以下所示:
須要測試的類:
package com.zhangguo.mall.utils; public class MathUtils { public int add(int a, int b) { return a + b; } public int sub(int a, int b) { return a - b; } public int div(int a, int b) { if (b == 0) { throw new java.lang.ArithmeticException(); } return a / b; } public int mut(int a, int b) { return a * b; } }
測試類:
package test.com.zhangguo.mall.utils; import com.zhangguo.mall.utils.MathUtils; import org.junit.Assert; import org.junit.Test; import org.junit.Before; import org.junit.After; /** * MathUtils Tester. * * @author <Authors name> * @version 1.0 * @since <pre>09/05/2018</pre> */ public class MathUtilsTest { MathUtils mathUtils=null; @Before //每一個測試方法運行前都會執行的方法 public void before() throws Exception { mathUtils=new MathUtils(); } @After //每一個測試方法運行後都會執行的方法 public void after() throws Exception { } /** * Method: add(int a, int b) */ @Test //被測試的方法 public void testAdd() throws Exception { int result=mathUtils.add(100,100); //斷言 Assert.assertEquals(300,result); } /** * Method: sub(int a, int b) */ @Test public void testSub() throws Exception { } /** * Method: div(int a, int b) */ @Test(expected = java.lang.ArithmeticException.class) public void testDiv() throws Exception { int result=mathUtils.div(100,0); } /** * Method: mut(int a, int b) */ @Test public void testMut() throws Exception { //TODO: Test goes here... } }
運行全部測試方法
運行單個測試方法
測試dao,沒有問題
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.entities.Goods; 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 java.io.IOException; import java.util.Date; import java.util.List; @WebServlet("/GoodsServlet") public class GoodsServlet extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); //請求類型 String action = request.getParameter("action"); goodsDao=new GoodsDao(); //若是是列表 if(action.equals("list")){ //得到全部商品 List<Goods> goods=goodsDao.getAllGoods(); //附加數據,傳遞給視圖 request.setAttribute("goods",goods); //轉發到顯示頁面 request.getRequestDispatcher("WEB-INF/views/goods/list.jsp").forward(request,response); }else{ response.getWriter().write("action不能爲空"); } response.getWriter().write(new Date().toString()); } }
結構:
商品展現頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <title>商品管理</title> </head> <body> <h2>商品管理</h2> <div> <table width="100%" border="1"> <tr> <th> 序號 </th> <th> 編號 </th> <th> 名稱 </th> <th> 價格 </th> <th> 日期 </th> <th> 狀態 </th> </tr> <c:forEach items="${goods}" var="entity" varStatus="state"> <tr> <td> ${state.index+1} </td> <td> ${entity.id} </td> <td> ${entity.title} </td> <td> ${entity.price} </td> <td> ${entity.add_date} </td> <td> ${entity.state} </td> </tr> </c:forEach> </table> </div> </body> </html>
結構:
運行結果:
數據訪問:
package com.zhangguo.mall.dao; import com.zhangguo.mall.entities.Goods; import com.zhangguo.mall.utils.JDBCUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; /**商品數據訪問*/ public class GoodsDao { /**得到全部商品*/ public List<Goods> getAllGoods(){ //要執行的sql String sql="SELECT\n" + "goods.id,\n" + "goods.title,\n" + "goods.category_id,\n" + "goods.add_date,\n" + "goods.picture,\n" + "goods.state,\n" + "goods.details,\n" + "goods.price\n" + "FROM\n" + "goods"; //結果集 ResultSet rs=null; //將要返回的集合 List<Goods> entities=new ArrayList<>(); try{ //經過工具類的query方法得到結果集,執行查詢 rs=JDBCUtils.query(sql); //經過遊標得到單行數據 while (rs.next()){ //實例化單個商品對象 Goods entity=new Goods(); //設置實體的屬性值,從當前行中得到數據 entity.setId(rs.getInt("id")); entity.setTitle(rs.getString("title")); entity.setCategory_id(rs.getInt("category_id")); entity.setAdd_date(rs.getDate("add_date")); entity.setPicture(rs.getString("picture")); entity.setState(rs.getInt("state")); entity.setDetails(rs.getString("details")); entity.setPrice(rs.getBigDecimal("price")); //將實體添加到集合中 entities.add(entity); } } catch (Exception e) { e.printStackTrace(); } finally { //確保能夠關閉對象 JDBCUtils.close(rs); } //返回結果 return entities; } /**得到總記錄數*/ public int getCount(){ String sql="select count(*) as count from goods"; Map<String,Object> result=JDBCUtils.queryForMap(sql); return Integer.parseInt(result.get("count")+""); } /**得到全部商品*/ public List<Goods> getGoodsPager(int pageNo,int size){ //要跳過多少記錄,從0開始 int skip=(pageNo)*size; //得到多少條記錄 int take=size; //要執行的sql String sql="SELECT\n" + "goods.id,\n" + "goods.title,\n" + "goods.category_id,\n" + "goods.add_date,\n" + "goods.picture,\n" + "goods.state,\n" + "goods.details,\n" + "goods.price\n" + "FROM\n" + "goods limit ?,?"; //結果集 ResultSet rs=null; //將要返回的集合 List<Goods> entities=new ArrayList<>(); try{ //經過工具類的query方法得到結果集,執行查詢 rs=JDBCUtils.query(sql,skip,take); //經過遊標得到單行數據 while (rs.next()){ //實例化單個商品對象 Goods entity=new Goods(); //設置實體的屬性值,從當前行中得到數據 entity.setId(rs.getInt("id")); entity.setTitle(rs.getString("title")); entity.setCategory_id(rs.getInt("category_id")); entity.setAdd_date(rs.getDate("add_date")); entity.setPicture(rs.getString("picture")); entity.setState(rs.getInt("state")); entity.setDetails(rs.getString("details")); entity.setPrice(rs.getBigDecimal("price")); //將實體添加到集合中 entities.add(entity); } } catch (Exception e) { e.printStackTrace(); } finally { //確保能夠關閉對象 JDBCUtils.close(rs); } //返回結果 return entities; } }
控制器:
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.entities.Goods; 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 java.io.IOException; import java.util.Date; import java.util.List; @WebServlet("/GoodsServlet") public class GoodsServlet extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); //請求類型 String action = request.getParameter("action"); goodsDao=new GoodsDao(); //若是是列表 if(action.equals("list")){ String pageNoStr=request.getParameter("pageNo"); String pageSizeStr=request.getParameter("pageSize"); if(pageNoStr!=null&&pageSizeStr!=null){ int pageNo =Integer.parseInt(pageNoStr); int pageSize =Integer.parseInt(pageSizeStr); //得到全部商品 List<Goods> goods=goodsDao.getGoodsPager(pageNo,pageSize); //附加數據,傳遞給視圖 request.setAttribute("goods",goods); //總記錄數 request.setAttribute("count",goodsDao.getCount()); //當前頁號 request.setAttribute("pageNo",pageNo); //須要首次加載 request.setAttribute("load_first_page","false"); }else{ //須要首次加載 request.setAttribute("load_first_page","true"); } //轉發到顯示頁面 request.getRequestDispatcher("WEB-INF/views/goods/list.jsp").forward(request,response); }else{ response.getWriter().write("action不能爲空"); } response.getWriter().write(new Date().toString()); } } /* //默認爲第1頁 int pageNo=1; //若是參數中存在頁號,則取出 String pageNoStr=request.getParameter("pageNo"); if(pageNoStr!=null&&!pageNoStr.equals("")) { pageNo = Integer.parseInt(pageNoStr); } //默認每頁條記錄 int pageSize =5; String pageSizeStr=request.getParameter("pageSize"); if(pageSizeStr!=null&&!pageSizeStr.equals("")) { pageSize = Integer.parseInt(pageSizeStr); } */
單元測試:
package test.com.zhangguo.mall.dao; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.entities.Goods; import org.junit.Assert; import org.junit.Test; import org.junit.Before; import org.junit.After; import java.util.List; /** * GoodsDao Tester. * * @author <Authors name> * @version 1.0 * @since <pre>09/07/2018</pre> */ public class GoodsDaoTest { GoodsDao dao=null; @Before public void before() throws Exception { dao=new GoodsDao(); } @After public void after() throws Exception { } /** * Method: getGetCount() */ @Test public void testGetCount() throws Exception { Assert.assertEquals(35,dao.getCount()); } /** * Method: getAllGoods() */ @Test public void testGetAllGoods() throws Exception { } /** * Method: getGoodsPager(int pageNo, int size) */ @Test public void testGetGoodsPager() throws Exception { List<Goods> list=dao.getGoodsPager(1,10); System.out.println(list); Assert.assertEquals(10,list.size()); } }
結果:
代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <title>商品管理</title> </head> <body> <h2>商品管理</h2> <div> <table width="100%" border="1"> <tr> <th> 序號 </th> <th> 編號 </th> <th> 名稱 </th> <th> 價格 </th> <th> 日期 </th> <th> 狀態 </th> </tr> <c:forEach items="${goods}" var="entity" varStatus="state"> <tr> <td> ${state.index+1} </td> <td> ${entity.id} </td> <td> ${entity.title} </td> <td> ${entity.price} </td> <td> ${entity.add_date} </td> <td> ${entity.state} </td> </tr> </c:forEach> </table> <div id="pagination"></div> </div> <link rel="stylesheet" href="../../../js/pagination22/pagination.css" type="text/css"/> <script src="../../../js/jquery/jquery-1.11.3.min.js"></script> <script src="../../../js/pagination22/jquery.pagination2.2.js"></script> <script> var load_first_page=<c:out value="${load_first_page}"></c:out>; var pageCount='<c:out value="${count}"></c:out>'||0; var pageSize=5; var current_page='<c:out value="${pageNo}"></c:out>'||0; $("#pagination").pagination(pageCount, { items_per_page: pageSize, next_text: "下一頁", next_show_always: true, prev_text: "上一頁", prev_show_always: true, current_page:current_page, num_edge_entries:2, load_first_page:load_first_page, //是否首次加載,是否首次就執行handlePaginationClick callback: handlePaginationClick }); function handlePaginationClick(pageNo, pagination_container) { location.href="GoodsServlet?action=list&pageNo="+pageNo+"&pageSize="+pageSize; } </script> </body> </html>
結果:
package com.zhangguo.mall.utils; import java.text.SimpleDateFormat; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtils { /** * 序列化成json * */ public static String toJson(Object obj) { // 對象映射器 ObjectMapper mapper = new ObjectMapper(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss"); mapper.setDateFormat(sdf); String result = null; // 序列化user對象爲json字符串 try { result = mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { e.printStackTrace(); } return result; } /** * 反序列化成對象 * */ public static <T> T toObject(String json,Class<T> valueType) { //對象映射器 ObjectMapper mapper=new ObjectMapper(); T result=null; try { result=mapper.readValue(json,valueType); }catch (Exception e) { e.printStackTrace(); } return result; } }
測試:
package test.com.zhangguo.mall.utils; import com.zhangguo.mall.utils.JsonUtils; import org.junit.Test; import org.junit.Before; import org.junit.After; /** * JsonUtils Tester. * * @author <Authors name> * @version 1.0 * @since <pre>09/10/2018</pre> */ public class JsonUtilsTest { @Before public void before() throws Exception { } @After public void after() throws Exception { } /** * Method: toJson(Object obj) */ @Test public void testToJson() throws Exception { Student tom=new Student(9001,"湯姆"); System.out.println(JsonUtils.toJson(tom)); } /** * Method: toObject(String json, Class<T> valueType) */ @Test public void testToObject() throws Exception { String json="{\"id\":9002,\"name\":\"馬力\"}"; System.out.println(JsonUtils.toObject(json,Student.class)); } }
結果:
Servlet:
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.utils.JsonUtils; 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 java.io.IOException; @WebServlet("/GoodsApi") public class GoodsApi extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); //請求類型 String action = request.getParameter("action"); goodsDao=new GoodsDao(); //若是是列表 if(action.equals("list")) { //R response.getWriter().write(JsonUtils.toJson(goodsDao.getAllGoods())); }else{ response.getWriter().write("action不能爲空"); } } }
結果:
index.html頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天狗商城</title> </head> <body> <h2>天狗商城</h2> <table border="1" width="100%" id="tabGoods"> <tr> <th>序號</th> <th>編號</th> <th>名稱</th> <th>價格</th> <th>日期</th> <th>狀態</th> <th>操做</th> </tr> </table> <script src="js/jquery/jquery-1.11.3.js"></script> <script> var app={ init:function () { app.load(); }, load:function () { $.ajax({ url:"GoodsApi?action=list", type:"get", dataType:"json", success:function (data) { for(var i=0;i<data.length;i++){ var obj=data[i]; var tr=$("<tr/>"); $("<td/>").text(i+1).appendTo(tr); $("<td/>").text(obj.id).appendTo(tr); $("<td/>").text(obj.title).appendTo(tr); $("<td/>").text(obj.price).appendTo(tr); $("<td/>").text(obj.add_date).appendTo(tr); $("<td/>").text(obj.state>0?"正常":"凍結").appendTo(tr); $("<td/>").text("刪除").appendTo(tr); $("#tabGoods").append(tr); } }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); } }; app.init(); </script> </body> </html><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天狗商城</title> </head> <body> <h2>天狗商城</h2> <table border="1" width="100%" id="tabGoods"> <tr> <th>序號</th> <th>編號</th> <th>名稱</th> <th>價格</th> <th>日期</th> <th>狀態</th> <th>操做</th> </tr> </table> <script src="js/jquery/jquery-1.11.3.js"></script> <script> var app={ init:function () { app.load(); }, load:function () { $.ajax({ url:"GoodsApi?action=list", type:"get", dataType:"json", success:function (data) { for(var i=0;i<data.length;i++){ var obj=data[i]; var tr=$("<tr/>"); $("<td/>").text(i+1).appendTo(tr); $("<td/>").text(obj.id).appendTo(tr); $("<td/>").text(obj.title).appendTo(tr); $("<td/>").text(obj.price).appendTo(tr); $("<td/>").text(obj.add_date).appendTo(tr); $("<td/>").text(obj.state>0?"正常":"凍結").appendTo(tr); $("<td/>").text("刪除").appendTo(tr); $("#tabGoods").append(tr); } }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); } }; app.init(); </script> </body> </html>
運行結果:
刪除服務:
dao:
package com.zhangguo.mall.dao; import com.zhangguo.mall.entities.Goods; import com.zhangguo.mall.utils.JDBCUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; /**商品數據訪問*/ public class GoodsDao { /**得到全部商品*/ public List<Goods> getAllGoods(){ //要執行的sql String sql="SELECT\n" + "goods.id,\n" + "goods.title,\n" + "goods.category_id,\n" + "goods.add_date,\n" + "goods.picture,\n" + "goods.state,\n" + "goods.details,\n" + "goods.price\n" + "FROM\n" + "goods"; //結果集 ResultSet rs=null; //將要返回的集合 List<Goods> entities=new ArrayList<>(); try{ //經過工具類的query方法得到結果集,執行查詢 rs=JDBCUtils.query(sql); //經過遊標得到單行數據 while (rs.next()){ //實例化單個商品對象 Goods entity=new Goods(); //設置實體的屬性值,從當前行中得到數據 entity.setId(rs.getInt("id")); entity.setTitle(rs.getString("title")); entity.setCategory_id(rs.getInt("category_id")); entity.setAdd_date(rs.getDate("add_date")); entity.setPicture(rs.getString("picture")); entity.setState(rs.getInt("state")); entity.setDetails(rs.getString("details")); entity.setPrice(rs.getBigDecimal("price")); //將實體添加到集合中 entities.add(entity); } } catch (Exception e) { e.printStackTrace(); } finally { //確保能夠關閉對象 JDBCUtils.close(rs); } //返回結果 return entities; } /**得到總記錄數*/ public int getCount(){ String sql="select count(*) as count from goods"; Map<String,Object> result=JDBCUtils.queryForMap(sql); return Integer.parseInt(result.get("count")+""); } /**得到全部商品*/ public List<Goods> getGoodsPager(int pageNo,int size){ //要跳過多少記錄,從0開始 int skip=(pageNo)*size; //得到多少條記錄 int take=size; //要執行的sql String sql="SELECT\n" + "goods.id,\n" + "goods.title,\n" + "goods.category_id,\n" + "goods.add_date,\n" + "goods.picture,\n" + "goods.state,\n" + "goods.details,\n" + "goods.price\n" + "FROM\n" + "goods limit ?,?"; //結果集 ResultSet rs=null; //將要返回的集合 List<Goods> entities=new ArrayList<>(); try{ //經過工具類的query方法得到結果集,執行查詢 rs=JDBCUtils.query(sql,skip,take); //經過遊標得到單行數據 while (rs.next()){ //實例化單個商品對象 Goods entity=new Goods(); //設置實體的屬性值,從當前行中得到數據 entity.setId(rs.getInt("id")); entity.setTitle(rs.getString("title")); entity.setCategory_id(rs.getInt("category_id")); entity.setAdd_date(rs.getDate("add_date")); entity.setPicture(rs.getString("picture")); entity.setState(rs.getInt("state")); entity.setDetails(rs.getString("details")); entity.setPrice(rs.getBigDecimal("price")); //將實體添加到集合中 entities.add(entity); } } catch (Exception e) { e.printStackTrace(); } finally { //確保能夠關閉對象 JDBCUtils.close(rs); } //返回結果 return entities; } /**根據編號刪除*/ public int delete(int id){ return JDBCUtils.update("delete from goods where id=?",id); } /**添加*/ public int add(Goods entity){ String sql="insert into goods(title,category_id,picture,price,details,state,add_date) \n" + "VALUES(?,3,'pic(1).jpg',?,?,default,?);"; return JDBCUtils.update(sql,entity.getTitle(),entity.getPrice(),entity.getDetails(),entity.getAdd_date()); } }
controller:
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.utils.JsonUtils; import javax.servlet.ServletException; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.HashMap; @WebServlet("/GoodsApi") public class GoodsApi extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } PrintWriter write; public void out(String outString){ try { write.write(outString); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); write=response.getWriter(); //請求類型 String action = request.getParameter("action"); goodsDao=new GoodsDao(); //若是是列表 if(action.equals("list")) { //R r=R.ok(goodsDao.getAllGoods()).put("a",100).put("b",200).put("dateTime",new Date()); out(R.ok(goodsDao.getAllGoods()).Json()); } else if(action.equals("del")) { int id=Integer.parseInt(request.getParameter("id")); if(goodsDao.delete(id)>0) { out(R.ok().Json()); }else{ out(R.error().Json()); } } else{ out(R.error("action不能爲空").Json()); } } } /**封裝返回結果*/ class R extends HashMap{ public R(int code, String msg, Object data) { this.put("code",code); this.put("msg",msg); this.put("data",data); } public String Json(){ return JsonUtils.toJson(this); } public R put(Object key, Object value) { super.put(key, value); return this; } public static R ok(String msg, Object data){ return new R(1,msg,data); } public static R ok(Object data){ return new R(1,"請求成功!",data); } public static R ok(){ return new R(1,"請求成功!",null); } public static R error(String msg, Object data){ return new R(0,msg,data); } public static R error(String msg){ return new R(0,msg,null); } public static R error(){ return new R(0,"請求失敗!",null); } }
UI調用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天狗商城</title> </head> <body> <h2>天狗商城</h2> <table border="1" width="100%" id="tabGoods"> <tr> <th>序號</th> <th>編號</th> <th>名稱</th> <th>價格</th> <th>日期</th> <th>狀態</th> <th>操做</th> </tr> </table> <form id="formGoods"> <fieldset> <legend>商品信息</legend> <p> <label for="title">名稱:</label> <input id="title" name="title" type="text"/> </p> <p> <label for="price">價格:</label> <input id="price" name="price" type="text"/> </p> <p> <label for="add_date">日期:</label> <input id="add_date" name="add_date" type="text"/> </p> <p> <label for="details">詳細:</label> <textarea id="details" name="details" rows="5" cols="50"></textarea> </p> <p> <button>添加</button> </p> </fieldset> </form> <script src="js/jquery/jquery-1.11.3.js"></script> <script> var app={ init:function () { app.load(); }, load:function () { $.ajax({ url:"GoodsApi?action=list", type:"get", dataType:"json", success:function (data) { if(data.code==1) { for (var i = 0; i < data.data.length; i++) { var obj = data.data[i]; var tr = $("<tr/>").data("obj",obj); $("<td/>").text(i + 1).appendTo(tr); $("<td/>").text(obj.id).appendTo(tr); $("<td/>").text(obj.title).appendTo(tr); $("<td/>").text(obj.price).appendTo(tr); $("<td/>").text(obj.add_date).appendTo(tr); $("<td/>").text(obj.state > 0 ? "正常" : "凍結").appendTo(tr); var del=$("<a/>").html("刪除").prop("href","#").addClass("del"); $("<td/>").append(del).appendTo(tr); $("#tabGoods").append(tr); } app.del(); } }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }, del:function () { $(".del").click(function () { if(confirm("您肯定要刪除嗎?")){ var obj=$(this).closest("tr").data("obj"); var that=this; $.ajax({ url:"GoodsApi?action=del", type:"get", data:{"id":obj.id}, dataType:"json", success:function (data) { if(data.code==1) { $(that).closest("tr").remove(); //刪除當前行 } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); } return false; }); } }; app.init(); </script> </body> </html>
運行結果:
dao數據訪問:
/**添加*/ public int add(Goods entity){ String sql="insert into goods(title,category_id,picture,price,details,state,add_date) \n" + "VALUES(?,3,'pic(1).jpg',?,?,default,?);"; return JDBCUtils.update(sql,entity.getTitle(),entity.getPrice(),entity.getDetails(),entity.getAdd_date()); }
控制器,服務:
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.entities.Goods; import com.zhangguo.mall.utils.JsonUtils; import javax.servlet.ServletException; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @WebServlet("/GoodsApi") public class GoodsApi extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } PrintWriter write; public void out(String outString){ try { write.write(outString); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); write=response.getWriter(); //請求類型 String action = request.getParameter("action"); goodsDao=new GoodsDao(); //若是是列表 if(action.equals("list")) { //R r=R.ok(goodsDao.getAllGoods()).put("a",100).put("b",200).put("dateTime",new Date()); out(R.ok(goodsDao.getAllGoods()).Json()); } else if(action.equals("del")) { int id=Integer.parseInt(request.getParameter("id")); if(goodsDao.delete(id)>0) { out(R.ok().Json()); }else{ out(R.error().Json()); } } else if(action.equals("add")) { Goods entity=new Goods(); //從客戶端得到提交的參數 String title=request.getParameter("title"); String price=request.getParameter("price"); String add_date=request.getParameter("add_date"); String details=request.getParameter("details"); entity.setTitle(title); //先將字符串類型的價格轉換成double類型,再轉換成定點小數 entity.setPrice(new BigDecimal(Double.parseDouble(price))); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); try { entity.setAdd_date(sdf.parse(add_date)); } catch (ParseException e) { e.printStackTrace(); } entity.setDetails(details); if(goodsDao.add(entity)>0) { out(R.ok().Json()); }else{ out(R.error().Json()); } } else{ out(R.error("action不能爲空").Json()); } } } /**封裝返回結果*/ class R extends HashMap{ public R(int code, String msg, Object data) { this.put("code",code); this.put("msg",msg); this.put("data",data); } public String Json(){ return JsonUtils.toJson(this); } public R put(Object key, Object value) { super.put(key, value); return this; } public static R ok(String msg, Object data){ return new R(1,msg,data); } public static R ok(Object data){ return new R(1,"請求成功!",data); } public static R ok(){ return new R(1,"請求成功!",null); } public static R error(String msg, Object data){ return new R(0,msg,data); } public static R error(String msg){ return new R(0,msg,null); } public static R error(){ return new R(0,"請求失敗!",null); } }
前端頁面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天狗商城</title> </head> <body> <h2>天狗商城</h2> <table border="1" width="100%" id="tabGoods"> <tr> <th>序號</th> <th>編號</th> <th>名稱</th> <th>價格</th> <th>日期</th> <th>狀態</th> <th>操做</th> </tr> </table> <form id="formGoods"> <fieldset> <legend>商品信息</legend> <p> <label for="title">名稱:</label> <input id="title" name="title" type="text"/> </p> <p> <label for="price">價格:</label> <input id="price" name="price" type="text"/> </p> <p> <label for="add_date">日期:</label> <input id="add_date" name="add_date" type="date"/> </p> <p> <label for="details">詳細:</label> <textarea id="details" name="details" rows="5" cols="50"></textarea> </p> <p> <button id="btnAdd" type="button">添加</button> </p> </fieldset> </form> <script src="js/jquery/jquery-1.11.3.js"></script> <script> var app={ init:function () { app.load(); app.bind(); }, load:function () { $.ajax({ url:"GoodsApi?action=list", type:"get", dataType:"json", success:function (data) { if(data.code==1) { $("#tabGoods tr:gt(0)").remove(); for (var i = 0; i < data.data.length; i++) { var obj = data.data[i]; var tr = $("<tr/>").data("obj",obj); $("<td/>").text(i + 1).appendTo(tr); $("<td/>").text(obj.id).appendTo(tr); $("<td/>").text(obj.title).appendTo(tr); $("<td/>").text(obj.price).appendTo(tr); $("<td/>").text(obj.add_date).appendTo(tr); $("<td/>").text(obj.state > 0 ? "正常" : "凍結").appendTo(tr); var del=$("<a/>").html("刪除 ").prop("href","#").addClass("del"); var edit=$("<a/>").html(" | 編輯").prop("href","#").addClass("edit"); $("<td/>").append(del).append(edit).appendTo(tr); $("#tabGoods").append(tr); } app.del(); } }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }, del:function () { $(".del").click(function () { if(confirm("您肯定要刪除嗎?")){ var obj=$(this).closest("tr").data("obj"); var that=this; $.ajax({ url:"GoodsApi?action=del", type:"get", data:{"id":obj.id}, dataType:"json", success:function (data) { if(data.code==1) { $(that).closest("tr").remove(); //刪除當前行 } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); } return false; }); }, bind:function () { //用於綁定事件 $("#btnAdd").click(function () { $.ajax({ url:"GoodsApi?action=add", type:"post", data:$("#formGoods").serialize(), dataType:"json", success:function (data) { if(data.code==1) { app.load(); } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }); $("#tabGoods").on("click",".edit",function () { var obj=$(this).closest("tr").data("obj"); var that=this; alert(JSON.stringify(obj)); }); } }; app.init(); </script> </body> </html>
運行結果:
dao數據訪問:
/**編輯*/ public int edit(Goods entity){ String sql="update goods set title=?,price=?,details=?,add_date=? where id=?"; return JDBCUtils.update(sql,entity.getTitle(),entity.getPrice(),entity.getDetails(),entity.getAdd_date(),entity.getId()); }
控制器,服務:
package com.zhangguo.mall.controller; import com.zhangguo.mall.dao.GoodsDao; import com.zhangguo.mall.entities.Goods; import com.zhangguo.mall.utils.JsonUtils; import javax.servlet.ServletException; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @WebServlet("/GoodsApi") public class GoodsApi extends HttpServlet { GoodsDao goodsDao; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } PrintWriter write; public void out(String outString) { try { write.write(outString); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); write = response.getWriter(); //請求類型 String action = request.getParameter("action"); goodsDao = new GoodsDao(); //若是是列表 if (action.equals("list")) { //R r=R.ok(goodsDao.getAllGoods()).put("a",100).put("b",200).put("dateTime",new Date()); out(R.ok(goodsDao.getAllGoods()).Json()); } else if (action.equals("del")) { int id = Integer.parseInt(request.getParameter("id")); if (goodsDao.delete(id) > 0) { out(R.ok().Json()); } else { out(R.error().Json()); } } else if (action.equals("add")) { Goods entity = new Goods(); //從客戶端得到提交的參數 String title = request.getParameter("title"); String price = request.getParameter("price"); String add_date = request.getParameter("add_date"); String details = request.getParameter("details"); entity.setTitle(title); //先將字符串類型的價格轉換成double類型,再轉換成定點小數 entity.setPrice(new BigDecimal(Double.parseDouble(price))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { entity.setAdd_date(sdf.parse(add_date)); } catch (ParseException e) { e.printStackTrace(); } entity.setDetails(details); if (goodsDao.add(entity) > 0) { out(R.ok().Json()); } else { out(R.error().Json()); } } else if (action.equals("edit")) { Goods entity = new Goods(); //從客戶端得到提交的參數 int id = Integer.parseInt(request.getParameter("id")); String title = request.getParameter("title"); String price = request.getParameter("price"); String add_date = request.getParameter("add_date"); String details = request.getParameter("details"); entity.setId(id); entity.setTitle(title); //先將字符串類型的價格轉換成double類型,再轉換成定點小數 entity.setPrice(new BigDecimal(Double.parseDouble(price))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { entity.setAdd_date(sdf.parse(add_date)); } catch (ParseException e) { e.printStackTrace(); } entity.setDetails(details); if (goodsDao.edit(entity) > 0) { out(R.ok().Json()); } else { out(R.error().Json()); } } else { out(R.error("action不能爲空").Json()); } } } /** * 封裝返回結果 */ class R extends HashMap { public R(int code, String msg, Object data) { this.put("code", code); this.put("msg", msg); this.put("data", data); } public String Json() { return JsonUtils.toJson(this); } public R put(Object key, Object value) { super.put(key, value); return this; } public static R ok(String msg, Object data) { return new R(1, msg, data); } public static R ok(Object data) { return new R(1, "請求成功!", data); } public static R ok() { return new R(1, "請求成功!", null); } public static R error(String msg, Object data) { return new R(0, msg, data); } public static R error(String msg) { return new R(0, msg, null); } public static R error() { return new R(0, "請求失敗!", null); } }
前端頁面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天狗商城</title> </head> <body> <h2>天狗商城</h2> <table border="1" width="100%" id="tabGoods"> <tr> <th>序號</th> <th>編號</th> <th>名稱</th> <th>價格</th> <th>日期</th> <th>狀態</th> <th>操做</th> </tr> </table> <form id="formGoods"> <fieldset> <legend>商品信息</legend> <p> <label for="title">名稱:</label> <input id="title" name="title" type="text"/> </p> <p> <label for="price">價格:</label> <input id="price" name="price" type="text"/> </p> <p> <label for="add_date">日期:</label> <input id="add_date" name="add_date" type="date"/> </p> <p> <label for="details">詳細:</label> <textarea id="details" name="details" rows="5" cols="50"></textarea> </p> <p> <input id="id" name="id" value="" type="hidden"/> <button id="btnAdd" type="button">添加</button> <button id="btnEdit" type="button">更新</button> </p> </fieldset> </form> <script src="js/jquery/jquery-1.11.3.js"></script> <script> var app={ init:function () { app.load(); app.bind(); }, load:function () { $.ajax({ url:"GoodsApi?action=list", type:"get", dataType:"json", success:function (data) { if(data.code==1) { $("#tabGoods tr:gt(0)").remove(); for (var i = 0; i < data.data.length; i++) { var obj = data.data[i]; var tr = $("<tr/>").data("obj",obj); $("<td/>").text(i + 1).appendTo(tr); $("<td/>").text(obj.id).appendTo(tr); $("<td/>").text(obj.title).appendTo(tr); $("<td/>").text(obj.price).appendTo(tr); $("<td/>").text(obj.add_date).appendTo(tr); $("<td/>").text(obj.state > 0 ? "正常" : "凍結").appendTo(tr); var del=$("<a/>").html("刪除 ").prop("href","#").addClass("del"); var edit=$("<a/>").html(" | 編輯").prop("href","#").addClass("edit"); $("<td/>").append(del).append(edit).appendTo(tr); $("#tabGoods").append(tr); } app.del(); } }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }, del:function () { $(".del").click(function () { if(confirm("您肯定要刪除嗎?")){ var obj=$(this).closest("tr").data("obj"); var that=this; $.ajax({ url:"GoodsApi?action=del", type:"get", data:{"id":obj.id}, dataType:"json", success:function (data) { if(data.code==1) { $(that).closest("tr").remove(); //刪除當前行 } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); } return false; }); }, bind:function () { //用於綁定事件 $("#btnAdd").click(function () { $.ajax({ url:"GoodsApi?action=add", type:"post", data:$("#formGoods").serialize(), dataType:"json", success:function (data) { if(data.code==1) { app.load(); } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }); $("#tabGoods").on("click",".edit",function () { var obj=$(this).closest("tr").data("obj"); var that=this; //alert(JSON.stringify(obj)); $("#id").val(obj.id); $("#title").val(obj.title); $("#price").val(obj.price); $("#add_date").val(obj.add_date); $("#details").val(obj.details); return false; }); $("#btnEdit").click(function () { $.ajax({ url:"GoodsApi?action=edit", type:"post", data:$("#formGoods").serialize(), dataType:"json", success:function (data) { if(data.code==1) { app.load(); } alert(data.msg); }, error:function (xhr, textStatus, errorThrown) { alert("錯誤,"+textStatus+","+errorThrown); } }); }); } }; app.init(); </script> </body> </html>
運行結果:
https://www.bilibili.com/video/av9219224/
https://git.coding.net/zhangguo5/NFMall1.git
全部的dao要求有單元測試
表結構能夠參考MySQL強化練習
要求分頁
JavaWeb內部測試(一)