日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)

發布時間:2023/12/8 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb 入门级项目实战 -- 文章发布系统 (第六节) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

繼續上一節的內容,首先我們將配置方法寫在static塊里面吧,不然每次調用DataBaseUtils都需要去配置一下,這樣比較麻煩。

static {config("jdbc.properties"); }

08 查詢方法:queryForList 實現

queryForList方法是在實際開發中比較常用的一個方法,它的意思就是說,如果你從數據庫里查詢出來10條數據,那么用一個List包裹起來,每一條數據就是一個Map。

上代碼

/*** 查詢出數據,并且list返回* @param sql* @param objects* @return* @throws SQLException*/ public static List<Map<String,Object>> queryForList(String sql,Object...objects){List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();Connection connection = getConnection();PreparedStatement statement = null;ResultSet rs = null;try {statement = connection.prepareStatement(sql);for (int i = 0; i < objects.length; i++) {statement.setObject(i+1, objects[i]);}rs = statement.executeQuery();while(rs.next()){ResultSetMetaData resultSetMetaData = rs.getMetaData();int count = resultSetMetaData.getColumnCount(); //獲取列數Map<String,Object> map = new HashMap<String, Object>();for (int i = 0; i < count; i++) {map.put(resultSetMetaData.getColumnName(i+1), rs.getObject(resultSetMetaData.getColumnName(i+1)));}result.add(map);};} catch (SQLException e) {e.printStackTrace();}finally{closeConnection(connection, statement, rs);}return result; }

測試:

我剛才又添加了幾條數據到數據庫了,現在我們希望將查出來的結果集放到一個list中。

DataBaseUtils.config("jdbc.properties"); List list = DataBaseUtils.queryForList("select * from t_user"); System.out.println(list);

結果:

[{id=24cb5136-39cf-4109-a28b-d412efd6ad2d, sex=0, headerPic=null, username=趙六, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=319600c3-550a-4f9f-80cf-deebe2376528, sex=0, headerPic=null, username=張三, update_time=2016-10-04 22:52:01.0, address=保密, email=null, create_time=2016-10-04 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=3fe31336-a792-488f-9445-f3ebd30f9de3, sex=0, headerPic=null, username=王五, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=5830e229-06d5-463c-b17d-639977f7c60c, sex=0, headerPic=null, username=李四, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}]

成功了。

09 查詢方法:queryForMap 實現

這個方法的作用是查詢出一條數據,因為一個HashMap實際上就對應數據庫表的一行數據。剛才,我們已經實現了queryForList方法,所以,現在只需要稍微調用一下,queryForMap 方法就出來了。

思路就是我先查出一個list,然后取第一條就OK了。

代碼:

/*** 查詢出數據,并且map返回* @param sql* @param objects* @return* @throws SQLException*/ public static Map<String,Object> queryForMap(String sql,Object...objects) throws SQLException{Map<String,Object> result = new HashMap<String,Object>();List<Map<String,Object>> list = queryForList(sql, objects);if(list.size() != 1){return null;}result = list.get(0);return result; }

測試,查詢所有的數據:

DataBaseUtils.config("jdbc.properties"); Map map = DataBaseUtils.queryForMap("select * from t_user"); System.out.println(map);

運行結果為 null

因為查詢出來的不止一條數據,所以返回了null。

現在我們就查一條數據

DataBaseUtils.config("jdbc.properties"); Map map = DataBaseUtils.queryForMap("select * from t_user where username = ?","王五"); System.out.println(map);

運行結果:

{id=3fe31336-a792-488f-9445-f3ebd30f9de3, sex=0, headerPic=null, username=王五, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}

這樣就對了。

10 查詢方法:queryForBean 實現

終于到queryForBean了,這個方法的意思就是說,將查詢出來的一條數據(注意,只能是一條數據)轉換成JavaBean,也就是一個Java對象。

比如,我從t_user表中查一條數據出來,然后它就能給我返回一個User對象。很顯然,這個方法肯定需要用到Java的反射API和泛型。

因為我們之前已經寫好了queryForMap,所以在這個方法中,可以直接調用那個方法,這樣省去了很多的工作量。

大體的思路就是:

1.拿到map。

2.新建一個JavaBean,因為事先不知道JavaBean的類型,所以要傳進來一個class屬性,然后方法的返回值需要用到泛型,不然沒法new。

3.遍歷map中所有的key,想辦法獲取對應的set方法。(注意,你的JavaBean必須要符合Bean規范,否則會有問題的)

4.通過反射來調用set方法。

5. 返回已經注入好的JavaBean。

這個方法呢,我大概寫了2個小時,因為實在沒有寫過類似的代碼,只能自己在那一點點摸索。

代碼的話呢,肯定還有不足的地方,我大概測試了一下,不論怎么樣,差不多可以用。

OK,上代碼:

/*** 查詢出數據,并且返回一個JavaBean* @param sql* @param clazz* @param objects* @return* @throws NoSuchFieldException* @throws SecurityException*/ public static <T>T queryForBean(String sql,Class clazz,Object...objects){T obj = null;Map<String,Object> map = null;Field field = null;try {obj = (T) clazz.newInstance(); //創建一個新的Bean實例map = queryForMap(sql, objects); //先將結果集放在一個Map中} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}if(map == null){return null;}//遍歷Mapfor (String columnName : map.keySet()) {Method method = null;String propertyName = StringUtils.columnToProperty(columnName); //屬性名稱try {field = clazz.getDeclaredField(propertyName);} catch (NoSuchFieldException e1) {e1.printStackTrace();} catch (SecurityException e1) {e1.printStackTrace();} //獲取JavaBean中的字段String fieldType = field.toString().split(" ")[1]; //獲取該字段的類型//System.out.println(fieldType);Object value = map.get(columnName);if(value == null){continue;}/**獲取set方法的名字* */String setMethodName = "set" + StringUtils.upperCaseFirstCharacter(propertyName);//System.out.println(setMethodName);try {/**獲取值的類型* */String valueType = value.getClass().getName();/**查看類型是否匹配* */if(!fieldType.equalsIgnoreCase(valueType)){//System.out.println("類型不匹配");if(fieldType.equalsIgnoreCase("java.lang.Integer")){value = Integer.parseInt(String.valueOf(value));}else if(fieldType.equalsIgnoreCase("java.lang.String")){value = String.valueOf(value);}else if(fieldType.equalsIgnoreCase("java.util.Date")){valueType = "java.util.Date";//將value轉換成java.util.DateString dateStr = String.valueOf(value);Timestamp ts = Timestamp.valueOf(dateStr);Date date = new Date(ts.getTime());value = date;}}/**獲取set方法* *///System.out.println(valueType);method = clazz.getDeclaredMethod(setMethodName,Class.forName(fieldType));/**執行set方法* */method.invoke(obj, value);}catch(Exception e){e.printStackTrace();/**如果報錯,基本上是因為類型不匹配* */}}//System.out.println(obj);return obj; }

這段代碼涉及到兩個方法,我這邊也分享出來吧,我已經把它們放在StringUtils里面了。如果你自己也打算寫類似的小框架的話呢,這兩個方法很可能會被用到。

/*** 把數據庫字段名改為駝峰方式* @param column* @return*/ public static String columnToProperty(String column) {/**如果字段名為空,就返回空字符串* */if(isEmpty(column)) return "";/**獲取字段的長度,一般來說字段長度不可能有幾百個字節的,所以用Byte就行了* */Byte length = (byte) column.length();StringBuilder sb = new StringBuilder(length);int i = 0;/**遍歷字段的每一個字符* */for (int j = 0; j < length; j++) {/**匹配到第一個_* */if (column.charAt(j) == '_') {/**如果后面還有_,也就是連續的_,那么j就需要自增一個單位,直到后面不是_為止* */while (column.charAt(j + 1) == '_') {j += 1;}sb.append(("" + column.charAt(++j)).toUpperCase());} else {/**如果循環到的字符不是_,那么就保存下來* */sb.append(column.charAt(j));}}return sb.toString();}/*** 將一個字符串的首字母改成大寫* @param str* @return*/ public static String upperCaseFirstCharacter(String str){StringBuilder sb = new StringBuilder();char[] arr = str.toCharArray();for (int i = 0; i < arr.length; i++) {if(i==0) sb.append((arr[i] + "").toUpperCase());else sb.append((arr[i]+""));}return sb.toString(); }

測試

User user = DataBaseUtils.queryForBean("select * from t_user limit 1", User.class); System.out.println(user);

結果(我已經給User類改寫了toString方法):

User [id=24cb5136-39cf-4109-a28b-d412efd6ad2d, username=趙六, password=123456, headerPic=null, email=null, sex=0, createTime=2016-10-05 00:00:00.0, updateTime=2016-10-05 13:01:33.0, isDelete=0, address=保密, telephone=保密]

那么,好的,我們的DataBaseUtils暫時告一段落了。雖然還不完善,可是已經有了一個雛形了。所以,寫代碼不要怕,只要有時間,你肯定能寫出來,最多就是不完善罷了。你也可以利用網絡上的資源,有些東西慢慢琢磨,基本上都是可以弄出來的。很多初學者最大的問題就是不敢去嘗試,僅此而已。

接下來,我們繼續寫業務。

11 從controller層到service層

為了方便起見,我們就寫到Service就OK了,省去dao層。反正我經歷的幾個公司都是這么做的,他們似乎都有意弱化了dao層,直接寫到service層就結束了。

我們繼續編寫controller的代碼,因為要調用service的方法,所以,我們需要把必要的包導入進來。

<%@ page language="java" import="java.util.*,service.LoginService,util.StringUtils,bean.*" pageEncoding="UTF-8"%>

controller代碼

<%//獲取客戶端傳遞過來參數String username = request.getParameter("username");String password = request.getParameter("password");//System.out.println(username);//System.out.println(password);//如果用戶名和密碼不為空if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){out.print("-1");//錯誤碼-1 : 用戶名和密碼不能為空!}else{//初始化LoginServiceLoginService loginService = new LoginService();//接下來判斷用戶名是否存在User user = loginService.getUser(username);if(user == null){out.print("-2");//錯誤碼-2 : 用戶名不存在!}else//如果用戶名存在,那么驗證用戶名和密碼是否匹配if(!username.equals(user.getUsername()) || !password.equals(user.getPassword())){out.print("-3");//錯誤碼-3 : 用戶名或密碼錯誤!}else{//如果能到這一步,就說明用戶的確存在,而且賬號密碼也正確。那么就把user放在session中out.print("1");session.setAttribute("user", user);session.setAttribute("username", user.getUsername());}}%>

流程是這樣的,首先判斷用戶名和密碼是否為空,如果為空,就直接返回一個錯誤碼-1,接下來依次判斷用戶名是否存在,以及用戶名密碼是否都正確。

只要有一個不符合,就直接返回對應的錯誤碼。out對象是JSP九大隱式對象的一員,可以將某個值返回給前臺。

然后,如果賬號密碼都正確,那么就返回一個1,表示登錄成功,同時,把user對象和用戶名放到session中。

session的話,就是瀏覽器作用域,只要你瀏覽器開著,里面的值就存在著。瀏覽器一關,存在session中的東西就沒了。當然,你也可以自己設定session失效的時間。

你可以把session想象成一個籃子。籃子嘛,肯定是用來放東西的,就這么簡單。

service類:

代碼

package service;import bean.User; import util.DataBaseUtils;/*** 用戶登錄的服務類* @author lenovo**/ public class LoginService {public User getUser(String username){String sql = "select * from t_user where username = ?";User user = DataBaseUtils.queryForBean(sql, User.class, username);if(user == null){return null;}//System.out.println(user);return user;}}

現在里面只有一個getUser方法,就是傳入一個username,然后返回一個User對象。

我們剛才編寫的DataBaseUtils終于可以大顯身手啦! ^_^

讓我們回到login.jsp,現在可以把登錄事件完善一下了。

代碼

<script>function login(){var username = $('#username').val();var password = $('#password').val();$.ajax({type:"post",//請求方式url:"${basePath}/controller/loginController.jsp",//請求地址data:{"username":username,"password":password},//傳遞給controller的json數據error:function(){//如果出錯了,將事件重新綁定alert("登陸出錯!");},success:function(data){ //返回成功執行回調函數。if(data == -1){alert('用戶名和密碼不能為空!');}else if(data == -2){alert('用戶名不存在!');}else if(data == -3){alert('用戶名或密碼錯誤!');}else{//登錄成功后返回首頁window.location.href = "${basePath}"; }}});}</script>

12 登錄功能完成

點擊登錄

把用戶名改為張三



點擊登錄。

密碼改為123456,

點擊登錄。


成功了,跳轉到了首頁!

最后說兩句,登錄功能終于做完了,想想還有點小激動呢。^_^

這也是我第一次封裝一個自己的DataBaseUtils,雖然不完善,可是畢竟能用。其實,這已經有那么一點點框架的味道了。我的觀點就是這樣,不管怎么樣,都要去努力嘗試,就算自己的代碼寫得再爛,也要努力去寫。

知識點學了就是要拿來用的,不然學它干嘛呢?

培訓的時候,泛型,反射這些知識點也會講到,可是如果我們只是記住了教程里面的那幾個例子,多半還是語法級別的內容,是沒有太大的意義的。必須要自己反思,我能用這些知識點來做些什么?

俗話說得好,一屋不掃,何以掃天下?尤其是對于初學者,不要總想著什么框架,總想著去學什么新技術。關鍵還是要自己總結和反思,還有,必須,一定,毫不猶豫地,要自己學著做項目。什么項目都行,但一定要自己去嘗試。

很多初學者,都有這么一個思維,就是我一定要做一個OA,我一定要做一個ERP。似乎在他們眼中,只有這種的才算是項目。

結果就是,他們一直在學,永遠也學不完,就是不敢去找工作。

其實在我看來,OA,ERP這種,一個人完成是不太現實的,這應該是一個團隊的事情。對于初學者而言,你完全可以自己做一個小型的項目,比如日記本系統,學生管理系統。

通過做項目,去把知識點一個個地累積起來。

所謂的OA,不也是這么回事嗎?

一個業務系統,里面至少有幾十個,甚至幾百個菜單。總體來看的確很龐大,但是你只要一細分,你會發現大部分菜單都差不多,無非業務變一下罷了。說穿了還不就是MVC。

所謂的業務系統就是這樣的,就是不斷地加功能,加菜單。

一個大項目和小項目,單個菜單的難度其實是差不太多的,技術點無非就那么幾個。復雜的是業務,所以你有的時候會在面試的時候聽到:我們不關心技術,只關心業務的言論。

所以,沒必要給自己設限,總是覺得,哎呀,我一定做一個OA系統,一定要學會工作流,甚至我一定要去學大數據。

不是這樣的,我感覺這不是初學者該考慮的問題。要知道,那種大型的業務系統,動輒幾百個菜單,本來就不是靠一個人完成的,多數情況是一個團隊開發一個月,或者幾個月的事情。

還有一點就是,不要對框架產生畏懼心理,我很明白,很多人初學Java都會聽到SSH的大名,有些人非常迫切地想要一份工作,于是買了很多SSH的書來看。

不看不要緊,一看很容易就懵逼了,因為根本看不懂。

其實,不是你看不懂,而是你做的東西太少。

很多人,明明Java基礎挺好的,就是總喜歡把精力放在研究框架的書籍上面,不肯去自己動手寫項目。

框架只是一個工具,僅此而已。

要真正理解框架,還是要通過做項目的。

無論這個項目有多小,都無所謂,關鍵是,你要敢于去嘗試。而不是說,只有OA,ERP才是項目,然后,你覺得哎呀,好難啊,我做不了了。我還是繼續去買書來看吧。接著就是,“你好,我們是某某培訓公司的,我們在網上看到你的簡歷。。。”

你看再多的視頻,買再多的書,都不如自己做個項目來得快。

就是這樣的,個人感慨。

本文結束。



總結

以上是生活随笔為你收集整理的JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 污视频在线免费 | 最好看的中文字幕国语电影mv | 免费a级大片 | 国产精品美女www爽爽爽 | 国产欧美精品区一区二区三区 | 不卡av网 | 精品视频 | 成人一级黄色片 | 春闺艳妇(h)高h产乳 | 国产探花在线精品一区二区 | 天天操天天操天天操 | 含羞草一区二区三区 | 新中文字幕 | 精品视频网 | 少妇h视频 | 色桃网 | av小说在线 | 国产呦小j女精品视频 | 囯产精品久久久久久 | 男人天堂aaa | 日韩三区四区 | 伦伦影院午夜理伦片 | 91看大片| 中文字幕精品久久 | 中文字幕综合在线 | 操操操视频 | 国产情侣激情 | 久热欧美 | 国产调教在线 | 日本视频h | 中文字幕免费av | 中国少妇高潮 | 波多野结衣视频免费看 | 96久久久 | 日本一区二区免费在线 | 国产一区二区三区 | www视频在线观看免费 | 亚洲射吧 | 日韩色图一区 | 亚洲国产黄色 | 精品少妇人妻av一区二区三区 | www国产www | jzzjzzjzz亚洲成熟少妇 | 肉肉视频在线观看 | 69视频免费看 | 国产伦精品一区二区三区视频1 | 亚洲人久久 | 日本美女裸体视频 | 99久久精品无码一区二区毛片 | 一级全黄裸体免费观看视频 | 精品人妻在线播放 | 91超碰在线免费观看 | 日本69少妇 | 国产农村妇女毛片精品 | 一级免费看片 | 成人片在线免费看 | 国产精品久久不卡 | 高清中文字幕在线a片 | 久久黄页 | 老太脱裤让老头玩ⅹxxxx | 日本高清视频在线 | av网在线观看 | 强迫凌虐淫辱の牝奴在线观看 | 久久久久逼 | 午夜日韩视频 | 91视频黄版 | 99re视频精品| 免费大片在线观看www | 日本va视频 | 日韩欧美一区二区三区 | 特级精品毛片免费观看 | 日韩av在线播放不卡 | 黄色大片a级 | 美女网站在线看 | 国产精品麻豆一区二区 | 四虎精品在永久在线观看 | 超碰免费在线观看 | av第下页 | 蜜臀av无码精品人妻色欲 | 亚洲永久av| 善良的女朋友在线观看 | 日日影院| 韩国精品一区 | 欧美jizz19性欧美 | 国产又白又嫩又爽又黄 | 小蝌蚪av | 女性裸体不遮胸图片 | 男女交性视频 | 日本黄色大片视频 | 999国产精品视频 | 岳狂躁岳丰满少妇大叫 | 天天噜夜夜噜 | 国产精品一线天 | 西西毛片| 欧美日韩一区二区视频在线观看 | 天天插天天 | 亚洲欧美乱日韩乱国产 | 欧美怡红院视频 | 亚洲日本精品一区 |