101、 easy ui 自定義驗證器
//自定義驗證 $.extend($.fn.validatebox.defaults.rules, { phoneRex: { validator: function(value){ var rex=/^1[3-8]+\d{9}$/; //var rex=/^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/; //區號:前面一個0,後面跟2-3位數字 : 0\d{2,3} //電話號碼:7-8位數字: \d{7,8 //分機號:一般都是3位數字: \d{3,} //這樣連接起來就是驗證電話的正則表達式了:/^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/ var rex2=/^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/; if(rex.test(value)||rex2.test(value)) { // alert('t'+value); return true; }else { //alert('false '+value); return false; } }, message: '請輸入正確電話或手機格式' } });
102、easy ui 表單校驗
$("#save").click(function(){ var v = $("#addStaffForm").from("validate"); if(v){ $("#addStaffForm").submit(); } });
103、 jQuery判斷checkbox是否選中的3種方法
方法一:
if ($("#checkbox-id").get(0).checked) { // do something }
方法二:
if($('#checkbox-id').is(':checked')) { // do something }
方法三:
if ($('#checkbox-id').attr('checked')) { // do something }
在jQuery1.6版本之後,取複選框有沒有被選中,要用prop
if($('#checkbox-id').prop('checked')) { //do something }
function checkInfo(){ $("input[name='org3.otherValues']").each( function(){ if($(this).get(0).checked){ return true; } }); var org3_ids=$("#org3_ids").val(); if(org3_ids!=''){ return true; } alertMsg.warn("請選擇接收人!"); return false; }
獲取選擇 radio 的值
$("input:radio[name='checkboxName']:checked").val()
104、文件上傳
jquery OCUpload 一鍵上傳插件使用
105、mybaits 批量更新
做一個list 送到Dao
參考 https://blog.csdn.net/m0_37981235/article/details/79131493
<insert id="insertBatch" parameterType="com.stevezong.bos.entity.Region"> insert into bc_region (id, province, city, district, postcode) values <foreach collection="list" item="region" separator=","> (#{region.id,jdbcType=VARCHAR}, #{region.province,jdbcType=VARCHAR}, #{region.city,jdbcType=VARCHAR}, #{region.district,jdbcType=VARCHAR}, #{region.postcode,jdbcType=VARCHAR}) </foreach> </insert>
106、opi 操作
參考 https://www.cnblogs.com/LiZhiW/p/4313789.html?utm_source=tuicool&utm_medium=referral
107、pinyin4j
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --> <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.0</version> </dependency>
package com.stevezong.utils; import java.util.Arrays; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; public class PinYin4jUtils { /** * 將字符串轉換成拼音數組 * * @param src * @return */ public static String[] stringToPinyin(String src) { return stringToPinyin(src, false, null); } /** * 將字符串轉換成拼音數組 * * @param src * @return */ public static String[] stringToPinyin(String src, String separator) { return stringToPinyin(src, true, separator); } /** * 將字符串轉換成拼音數組 * * @param src * @param isPolyphone * 是否查出多音字的所有拼音 * @param separator * 多音字拼音之間的分隔符 * @return */ public static String[] stringToPinyin(String src, boolean isPolyphone, String separator) { // 判斷字符串是否爲空 if ("".equals(src) || null == src) { return null; } char[] srcChar = src.toCharArray(); int srcCount = srcChar.length; String[] srcStr = new String[srcCount]; for (int i = 0; i < srcCount; i++) { srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator); } return srcStr; } /** * 將單個字符轉換成拼音 * * @param src * @return */ public static String charToPinyin(char src, boolean isPolyphone, String separator) { // 創建漢語拼音處理類 HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); // 輸出設置,大小寫,音標方式 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); StringBuffer tempPinying = new StringBuffer(); // 如果是中文 if (src > 128) { try { // 轉換得出結果 String[] strs = PinyinHelper.toHanyuPinyinStringArray(src, defaultFormat); // 是否查出多音字,默認是查出多音字的第一個字符 if (isPolyphone && null != separator) { for (int i = 0; i < strs.length; i++) { tempPinying.append(strs[i]); if (strs.length != (i + 1)) { // 多音字之間用特殊符號間隔起來 tempPinying.append(separator); } } } else { tempPinying.append(strs[0]); } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } } else { tempPinying.append(src); } return tempPinying.toString(); } public static String hanziToPinyin(String hanzi) { return hanziToPinyin(hanzi, " "); } /** * 將漢字轉換成拼音 * * @param hanzi * @param separator * @return */ public static String hanziToPinyin(String hanzi, String separator) { // 創建漢語拼音處理類 HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); // 輸出設置,大小寫,音標方式 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); String pinyingStr = ""; try { pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator); } catch (BadHanyuPinyinOutputFormatCombination e) { // TODO Auto-generated catch block e.printStackTrace(); } return pinyingStr; } /** * 將字符串數組轉換成字符串 * * @param str * @param separator * 各個字符串之間的分隔符 * @return */ public static String stringArrayToString(String[] str, String separator) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length; i++) { sb.append(str[i]); if (str.length != (i + 1)) { sb.append(separator); } } return sb.toString(); } /** * 簡單的將各個字符數組之間連接起來 * * @param str * @return */ public static String stringArrayToString(String[] str) { return stringArrayToString(str, ""); } /** * 將字符數組轉換成字符串 * * @param str * @param separator * 各個字符串之間的分隔符 * @return */ public static String charArrayToString(char[] ch, String separator) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < ch.length; i++) { sb.append(ch[i]); if (ch.length != (i + 1)) { sb.append(separator); } } return sb.toString(); } /** * 將字符數組轉換成字符串 * * @param str * @return */ public static String charArrayToString(char[] ch) { return charArrayToString(ch, " "); } /** * 取漢字的首字母 * * @param src * @param isCapital * 是否是大寫 * @return */ public static char[] getHeadByChar(char src, boolean isCapital) { // 如果不是漢字直接返回 if (src <= 128) { return new char[] { src }; } // 獲取所有的拼音 String[] pinyingStr = PinyinHelper.toHanyuPinyinStringArray(src); // 創建返回對象 int polyphoneSize = pinyingStr.length; char[] headChars = new char[polyphoneSize]; int i = 0; // 截取首字符 for (String s : pinyingStr) { char headChar = s.charAt(0); // 首字母是否大寫,默認是小寫 if (isCapital) { headChars[i] = Character.toUpperCase(headChar); } else { headChars[i] = headChar; } i++; } return headChars; } /** * 取漢字的首字母(默認是大寫) * * @param src * @return */ public static char[] getHeadByChar(char src) { return getHeadByChar(src, true); } /** * 查找字符串首字母 * * @param src * @return */ public static String[] getHeadByString(String src) { return getHeadByString(src, true); } /** * 查找字符串首字母 * * @param src * @param isCapital * 是否大寫 * @return */ public static String[] getHeadByString(String src, boolean isCapital) { return getHeadByString(src, isCapital, null); } /** * 查找字符串首字母 * * @param src * @param isCapital * 是否大寫 * @param separator * 分隔符 * @return */ public static String[] getHeadByString(String src, boolean isCapital, String separator) { char[] chars = src.toCharArray(); String[] headString = new String[chars.length]; int i = 0; for (char ch : chars) { char[] chs = getHeadByChar(ch, isCapital); StringBuffer sb = new StringBuffer(); if (null != separator) { int j = 1; for (char ch1 : chs) { sb.append(ch1); if (j != chs.length) { sb.append(separator); } j++; } } else { sb.append(chs[0]); } headString[i] = sb.toString(); i++; } return headString; } public static void main(String[] args) { // pin4j 簡碼 和 城市編碼 String s1 = "×××"; String[] headArray = getHeadByString(s1); // 獲得每個漢字拼音首字母 System.out.println(Arrays.toString(headArray)); String s2 ="長城" ; System.out.println(Arrays.toString(stringToPinyin(s2,true,","))); String s3 ="長"; System.out.println(Arrays.toString(stringToPinyin(s3,true,","))); } }
108、數據庫 mysql replace into
replace into table(id, update_time) values(1, now());
1、首先判斷數據是否存在;
2、如果不存在,則插入;
3、如果存在,則更新。
在MySQL 中也可以先select,判斷是否存在,存在則 update 否則 insert
但在MySQL 中有更簡單的方法,使用 replace into關鍵字
replace into 跟 insert 功能類似,不同點在於:replace into 首先嚐試插入數據到表中。
1、如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然後插入新的數據。
2、 否則,直接插入新數據。
要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重複的數據。
109、打印mybaits的sql語句到控制檯
需要log4j 配合使用
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=d:\\mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### ### fatal error warn info debug trace log4j.rootLogger=debug, stdout
110、 mybaits 模糊查詢
兩個地方都需要調整
List<Region> findByQueryCriteria(@Param("par")String par);
<select id="findByQueryCriteria" resultMap="BaseResultMap" parameterType="string"> <bind name="pattern" value="'%' + par + '%'" /> select <include refid="Base_Column_List" /> from bc_region WHERE city LIKE #{pattern} OR district LIKE #{pattern} OR postcode LIKE #{pattern} OR shortcode LIKE #{pattern} OR citycode LIKE #{pattern} </select>
111、如何統計vim中查找字符串的數量
比如我有一個log文件,我文件裏符合規則的字符是yes,我想查找這個abc.log文件中的yes字符數量,怎麼查找呢,如下:
:%s/yes//gn
112、將表單序列化爲json對象
$.fn.serializeJson=function(){ var serializeObj={}; var array=this.serializeArray(); $(array).each(function(){ if(serializeObj[this.name]){ if($.isArray(serializeObj[this.name])){ serializeObj[this.name].push(this.value); }else{ serializeObj[this.name]=[serializeObj[this.name],this.value]; } }else{ serializeObj[this.name]=this.value; } }); return serializeObj; };
113\ CXF 填坑
使用cxf創建webservice,我用的是目前的最新的版本3.1.8。
啓動tomcat的時候發生了一個錯誤:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:META-INF/cxf/cxf-extension-soap.xml]
在cxf的3.0版本之後可能已經不需要這個配置文件了,需要在spring的xml配置文件裏刪除這個引用,也就是將:
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />去掉。
114\ Spring+Mybatis 查詢所有數據時發生異常:org.apache.ibatis.reflection.ReflectionException: There is no getter for
Spring+Mybatis框架整合時,根據條件查詢數據,發生異常
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'sname' in 'class java.lang.String'
userinfoMapper.xml文件:
<select id="findAll" parameterType="string" resultMap="userinfoMap"> select * from userinfo where sname like '%${sname}%' </select>
UserinfoMapper接口:
public List<Userinfo> findAll(String sname);
解決方法:在參數前加@Param標籤
public List<Userinfo> findAll(@Param("sname") String sname);
115\ 配置 mybatis mapper.xml文件時
注意 "必須匹配" 四個字, 其意味着順序很重要, 必須要一致,
試試將 resultMap 中各元素的順序修改爲和錯誤信息中屬性出現的順序( constructor , id result association .....)一致看看;
116\ 下拉框中 只會提交選中的
117\Java各種對象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的區分
PO:持久對象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每個屬性基本上都對應數據庫表裏面的某個字段。完全是一個符合Java Bean規範的純Java對象,沒有增加別的屬性和方法。持久對象是由insert數據庫創建,由數據庫delete刪除的。基本上持久對象生命週期和數據庫密切相關。
VO:值對象(Value Object),通常用於業務層之間的數據傳遞,和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不,這根據業務的需要。
表現層對象(View Object),主要對應展示界面顯示的數據對象,用一個VO對象來封裝整個界面展示所需要的對象數據。
BO:業務對象層的縮寫(Business Object),封裝業務邏輯的java對象,通過調用DAO方法,結合PO,VO進行業務操作。具體可以看網上的一個例子:
比如一個簡歷,有教育經歷、工作經歷、社會關係等等。
我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會關係對應一個PO。
建立一個對應簡歷的BO對象處理簡歷,每個BO包含這些PO。
這樣處理業務邏輯時,我們就可以針對BO去處理。
DTO:數據傳輸對象(Data Transfer Object),是一種設計模式之間傳輸數據的軟件應用系統。數據傳輸目標往往是數據訪問對象從數據庫中檢索數據。數據傳輸對象與數據交互對象或數據訪問對象之間的差異是一個以不具有任何行爲除了存儲和檢索的數據(訪問和存取器)。簡單來說,當我們需要一個對象10個字段的內容,但這個對象總共有20個字段,我們不需要把整個PO對象全部字段傳輸到客戶端,而是可以用DTO重新封裝,傳遞到客戶端。此時,如果這個對象用來對應界面的展現,就叫VO。
JavaBean:一種可重用組件,即“一次性編寫,任何地方執行,任何地方重用”。滿足三個條件①類必須是具體的和公共的②具有無參構造器③提供一致性設計模式的公共方法將內部域暴露成員屬性。
主要用途:可以用在 功能、處理、值、數據庫訪問和JSP中任何可以用Java代碼創造的對象。
有兩種:一種是有用戶界面(UI,User Interface)的JavaBean;還有一種是沒有用戶界面,主要負責處理事務(如數據運算,操縱數據庫)的JavaBean。JSP通常訪問的是後一種JavaBean。
分類:通常有Session bean,Entity bean,MessageDrivenBean三大類
——Session bean會話構件,是短暫的對象,運行在服務器上,並執行一些應用邏輯處理,它由客戶端應用程序建立,其數據需要自己來管理。分爲無狀態和有狀態兩種。
——Entity bean實體構件,是持久對象,可以被其他對象調用。在建立時指定一個唯一標示的標識,並允許客戶程序,根據實體bean標識來定位beans實例。多個實體可以併發訪問實體bean,事務間的協調由容器來完成。
——MessageDriven Bean消息構件,是專門用來處理JMS(Java Message System)消息的規範(EIB2.0)。JMS是一種與廠商無關的API,用來訪問消息收發系統,並提供了與廠商無關的訪問方法,以此來訪問消息收發服務。JMS客戶機可以用來發送消息而不必等待迴應。
JavaBeans:JavaBeans 從狹義來說,指的是 JavaBeans 規範也就是位於 java.beans 包中的一組 API。從廣義上來說,JavaBeans 指的是 API 集合,比如 Enterprise JavaBeans。
POJO:POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,是爲了避免和EJB混淆所創造的簡稱。通指沒有使用Entity Beans的普通java對象,可以把POJO作爲支持業務邏輯的協助類。
POJO實質上可以理解爲簡單的實體類,顧名思義POJO類的作用是方便程序員使用數據庫中的數據表,對於廣大的程序員,可以很方便的將POJO類當做對象來進行使用,當然也是可以方便的調用其get,set方法。POJO類也給我們在struts框架中的配置帶來了很大的方便。
一個POJO持久化以後就是PO
直接用它傳遞、傳遞過程中就是DTO
直接用來對應表示層就是VO
DAO: 數據訪問對象是第一個面向對象的數據庫接口,是一個數據訪問接口(Data Access Object)。它可以把POJO持久化爲PO,用PO組裝出來VO、DTO。
DAO模式是標準的J2EE設計模式之一.開發人員使用這個模式把底層的數據訪問操作和上層的商務邏輯分開.一個典型的DAO實現有下列幾個組件:
1. 一個DAO工廠類;
2. 一個DAO接口;
3. 一個實現DAO接口的具體類;
4. 數據傳遞對象(有些時候叫做值對象).
具體的DAO類包含了從特定的數據源訪問數據的邏輯,一般一個DAO類和一張表對應,每個操作要和事務關聯。
118\mybatis 中的 佔位符 和 字符串拼接
#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換。#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。
#{} 佔位符 => '張三'
SELECT * FROM emp WHERE name=#{name} SELECT * FROM emp WHERE name ='張三'
${} 字符串拼接 => 張三
SELECT * FROM emp WHERE name LIKE '%${name}%' SELECT * FROM emp WHERE name LIKE '%張三%'
在使用#{} 的時候 裏面可以隨便寫 #{v},#{value},#{hhhg},#{asdf},#{bbb},#{aaaa},#{name}
在使用${} 的事件 裏面只能用 value => ${value}
119\mybatis默認使用log4j作爲輸出日誌信息。
在config下創建log4j.properties如下:
# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
120\mybatis SqlMapConfig.xml中配置的內容和順序如下:
properties(屬性)
settings(全局配置參數)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境集合屬性對象)
environment(環境子屬性對象)
transactionManager(事務管理)
dataSource(數據源)
mappers(映射器)
121\mybatis 的foreach
在循環的時候
比如多個id
在 多個id 使用 int[] ids = new int[] {1,2,3};
collection 的值 必須是 array
<foreach collection="array" item="item" open="id IN (" close=")" separator=","> #{item} </foreach>
在使用 list的時候 collection 的值 必須是 list
122\mysql 去重 重複
SELECT DISTINCT job FROM myemp;
--DISTINCT 去重
SELECT DISTINCT job,deptno FROM myemp;
--多字段去重 是指的job 和deptno 的組合沒有重複的
SELECT DISTINCT count_time ,id c FROM es_gw SELECT COUNT(DISTINCT count_time ,id) c FROM es_gw
123\Mybatis逆向工程
使用官方網站的Mapper自動生成工具mybatis-generator-core來生成po類和Mapper映射文件
124\spring 解決post 提交亂碼
<filter> <filter-name>pageEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>pageEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
125\上傳數據
jquery OCUpload 一鍵上傳插件使用
1、引入js
<script src="${pageContext.request.contextPath }/js/jquery.ocupload-1.1.2.js" type="text/javascript"></script>
2、引入maven
<!-- 上傳文件 --> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> </dependency>
3、提供一個元素
<body> <input id="b" type="button" value="上傳"> </body>
3、寫js
<script type="text/javascript"> $(function(){ $('#b').upload({ action: 'region/importFile.do', name:"filename" }); }) </script>
4\java
package com.stevezong.bos.controller; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.stevezong.bos.utils.BosResult; @Controller @RequestMapping("/region") public class RegionFileUpload { @RequestMapping("/importFile.do") @ResponseBody public BosResult<Object> importFile(HttpServletRequest request){ BosResult<Object> result = new BosResult<Object>(); try { // 1、創建磁盤文件項工廠 //設置緩存文件的大小,設置臨時文件存儲的位置 //單位是字節 DiskFileItemFactory factory = new DiskFileItemFactory(); //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024,new File(d:/IceTemp)); // 2、創建文件上傳的核心類 ServletFileUpload upload = new ServletFileUpload(factory); // 3、解析request獲得文件項集合 List<FileItem> parseRequest = upload.parseRequest(request); // 4、遍歷文件項集合 for (FileItem sub : parseRequest) { // 5、判斷是否是普通表單項 if (sub.isFormField()) { // 普通表單項 String fieldName = sub.getFieldName(); String fieldVal = sub.getString(); System.out.println(fieldName + ":" + fieldVal); } else { // 文件上傳項 String fileName = sub.getName(); // 獲取流 InputStream in = sub.getInputStream(); String filePathStr = "d:/123/" + fileName; FileOutputStream fos = new FileOutputStream(filePathStr); IOUtils.copy(in, fos); in.close(); fos.close(); } } result.setStatus(0); result.setMsg("上傳成功"); } catch(Exception e) { e.printStackTrace(); } System.out.println("上傳ok"); return result; } }
126\解決 shiro和quartz 衝突
<!-- shiro s --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cas</artifactId> <version>1.2.3</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-quartz</artifactId> <version>1.2.3</version> <!-- 解決 shiro和quartz 衝突 --> <exclusions> <exclusion> <groupId>org.opensymphony.quartz</groupId> <artifactId>quartz</artifactId> </exclusion> </exclusions> </dependency> <!-- shiro e --> <!-- quartz s --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency> <!-- quartz e -->
127、啓動tomcat報錯
JNDI lookup for name [spring.liveBeansView.mbeanDomain]
threw NamingException with message: Name [spring.liveBeansView.mbeanDomain] is not bound in this Context. Unable to find [spring.liveBeansView.mbeanDomain].. Returning null.
可以正常運行項目,但看着不好,在網上查詢解決方法,最後在web.xml裏添加如下代碼問題解決
<context-param> <param-name>spring.profiles.active</param-name> <param-value>dev</param-value> </context-param> <context-param> <param-name>spring.profiles.default</param-name> <param-value>dev</param-value> </context-param> <context-param> <param-name>spring.liveBeansView.mbeanDomain</param-name> <param-value>dev</param-value> </context-param>
128、關於Spring的問題之Failed to read schema document
倒數第二的方法:將代碼剪切下來重新粘貼,然後保存 。 超級有用...
129、 斷網情況下 程序報錯Spring如何加載XSD文件(org.xml.sax.SAXParseException: Failed to read schema document錯誤的
xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd http://www.springframework.org/schema/aop classpath:org/springframework/aop/config/spring-aop-3.0.xsd http://www.springframework.org/schema/tx classpath:org/springframework/transaction/config/spring-tx-3.0.xsd http://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-3.0.xsd"
130、由於mapper接口編譯後在同一個目錄下沒有找到mapper映射文件而出現的。由於maven工程在默認情況下src/main/java目錄下的mapper文件是不發佈到target目錄下的。
!-- 如果不添加此節點mybatis的mapper.xml文件都會被漏掉。 -->
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
131、Zookeeper的安裝(最簡單版 注意防火牆)
安裝環境:
Linux:centos6.4
Jdk:1.7以上版本
Zookeeper是java開發的可以運行在windows、linux環境。需要先安裝jdk。
安裝步驟:
第一步:安裝jdk
第二步:把zookeeper的壓縮包上傳到linux系統。
第三步:解壓縮壓縮包
tar -zxvf zookeeper-3.4.6.tar.gz
第四步:進入zookeeper-3.4.6目錄,創建data文件夾。
第五步:把zoo_sample.cfg改名爲zoo.cfg
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
第六步:修改data屬性:dataDir=/root/zookeeper-3.4.6/data
第七步:啓動zookeeper
[root@localhost bin]# ./zkServer.sh start
關閉:[root@localhost bin]# ./zkServer.sh stop
查看狀態:[root@localhost bin]# ./zkServer.sh status
132、<!-- 配置資源映射 -->
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
location元素表示webapp目錄下的static包下的所有文件;mapping元素表示以/static開頭的所有請求路徑,如/static/a 或者/static/a/b;
該配置的作用是:DispatcherServlet不會攔截以/static開頭的所有請求路徑,並當作靜態資源交由Servlet處理。
https://www.cnblogs.com/linnuo/p/7699401.html
133、就是匹配到/路徑的請求,這樣能拿到路徑/後數據,比如請求是/qq,拿到的page的值就是qq
@RequestMapping("/{page}") @RequestMapping("/{page}") public String showPage(@PathVariable String page){ `return page; }
134、分頁處理(https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md)
逆向工程生成的代碼是不支持分頁處理的,如果想進行分頁需要自己編寫mapper,這樣就失去逆向工程的意義了。爲了提高開發效率可以使用mybatis的分頁插件PageHelper。
該插件目前支持Oracle、Mysql、MariaDB、SQLite、Hsqldb、PostgreSQL、DB2、SqlServer(2005,2008)、Informix、H2、SqlServer2012、Derby、Phoenix 十二種
PageHelper.startPage方法重要提示
只有緊跟在PageHelper.startPage方法後的第一個Mybatis的查詢(Select)方法會被分頁。
請不要配置多個分頁插件
請不要在系統中配置多個分頁插件(使用Spring時,mybatis-config.xml和Spring<bean>配置方式,請選擇其中一種,不要同時配置多個分頁插件)!
分頁插件不支持帶有for update語句的分頁
對於帶有for update的sql,會拋出運行時異常,對於這樣的sql建議手動分頁,畢竟這樣的sql需要重視。
分頁插件不支持嵌套結果映射
由於嵌套結果方式會導致結果集被摺疊,因此分頁查詢的結果在摺疊後總數會減少,所以無法保證分頁結果數量正確。
在代碼中使用:
//第一種,RowBounds方式的調用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
//第二種,Mapper接口方式的調用,推薦這種使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//第三種,Mapper接口方式的調用,推薦這種使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//第四種,參數方法調用
//存在以下 Mapper 接口方法,你不需要在 xml 處理後兩個參數
public interface CountryMapper {
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代碼中直接調用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);
//第五種,參數對象
//如果 pageNum 和 pageSize 存在於 User 對象中,只要參數有值,也會被分頁
//有如下 User 對象
public class User {
//其他fields
//下面兩個參數名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 處理後兩個參數
public interface CountryMapper {
List<Country> selectByPageNumSize(User user);
}
//當 user 中的 pageNum!= null && pageSize!= null 時,會自動分頁
List<Country> list = countryMapper.selectByPageNumSize(user);
//第六種,ISelect 接口方式
//jdk6,7用法,創建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() { @Override public void doSelect() { countryMapper.selectGroupBy(); } });
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());
//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() { @Override public void doSelect() { countryMapper.selectGroupBy(); } });
//對應的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());
//count查詢,返回一個查詢語句的count數
long total = PageHelper.count(new ISelect() {
@Override public void doSelect() { countryMapper.selectLike(country); } }); //lambda total = PageHelper.count(()->countryMapper.selectLike(country));
我最喜歡用的:
@Test public void test(){ //初始化Spring 容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml"); //從容器中獲取Mapper代理對象 TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class); //執行sql 語句之前設置分頁信息使用PageHelper的startPage方法 PageHelper.startPage(1,10); //執行查詢 TbItemExample example = new TbItemExample(); List<TbItem> list = itemMapper.selectByExample(example); //取分頁信息 PageInfo. 1總記錄數 2、總頁數 3、當前頁碼 PageInfo<TbItem> pageInfo = new PageInfo<>(list); long total = pageInfo.getTotal(); int pages = pageInfo.getPages(); System.out.println("總記錄數:"+total); System.out.println("總頁數:"+pages); System.out.println("list size:"+ list.size()); }
135.、Caused by: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageIntercepto
在maven 的引用中先引用了一次低版本的 5.x 之前的 後來有換成了5.x之後的 clean 項目 也沒用 後來手動刪除
.m2\repository\com\stevezong\* 重新install 才恢復
136、 在控制檯看不出bug的時候 使用log4j吧
log4j.properties: log4j.rootLogger=DEBUG,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
137、'com.github.pagehelper.Page' is an unknown class in WebappClassLoader
使用debug進行代碼根據發現,執行的過程中使用到了pagehelper插件中的一個叫做Page類。
析發現:出現上面的警告的原因是因爲序列化和反序列化過程沒有找到Page這個類。
要想解決上述問題,只需要在對應的業務層的pom.xml配置文件中加入pagehelper的依賴即可。
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </dependency>
138、安裝maven工程跳過測試
clean install -DskipTests
139、安裝nginx
yum install -y gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel
140、 通過配置文件修改網絡參數(永久)
需要重啓network服務後生效
①設置ip
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 設備名 ONBOOT=yes 啓動是否加載 BOOTPROTO=static 手動 dhcp則爲自動獲取,下面的ip參數就不用設置 IPADDR=192.168.4.1 ip地址 NETMASK=255.255.255.0 子網掩碼 MACADDR=xx:xx:xx:xx:xx:xx 修改mac地址 PEERDNS=no 禁止dhcp獲取時修改resolv.conf文件
#ifdown eth0 停用eth0 #ifup eth0 激活eth0
②修改主機名與網關
#vim /etc/sysconfig/network
HOSTNAME=XXX GATEWAY=192.168.4.254 網關
③設置域名ip對應關係
#vim /etc/hosts ip地址與主機名對應關係
格式:
ip FQDN 主機名
注:計算機改名後將ip與主機名的對應關係寫到hosts文件中,否則重啓過程非常慢(將進行主機名解析)
④指定DNS地址(立即生效)
#vim /etc/resolv.conf
設置dns,最多3條
search xxx.com nameserver 202.106.0.20
141、阿里 開源
https://opsx.alibaba.com/mirror?lang=zh-CN
142、換yum源
1、備份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、下載新的CentOS-Base.repo 到/etc/yum.repos.d/
CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成緩存
yum makecache
143、複製,移動,快照,克隆 linux 後 網絡問題
vim /etc/udev/rule.d/70-persistent-net.rules
將 文件中 eth0 註釋掉 將eth1 改爲eh0 記錄 eth1中的mac地址ATTR{address}=="00:0c:29:15:9e:c6"
原文件:
# PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ae:81:04", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:15:9e:c6", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
修改爲:
# PCI device 0x8086:0x100f (e1000) #SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ae:81:04", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:15:9e:c6", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
修改 eth0 配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
將mac 地址改爲 新的max地址
HWADDR=00:0C:29:15:9E:C6
重啓
reboot
144、@Value("#{}")與@Value("${}")的區別
1@Value("#{}") SpEL表達式
@Value("#{}") 表示SpEl表達式通常用來獲取bean的屬性,或者調用bean的某個方法。當然還有可以表示常量
2 @Value("${}")
通過@Value("${}") 可以獲取對應屬性文件中定義的屬性值。假如我有一個sys.properties文件 裏面規定了一組值: web.view.prefix =/WEB-INF/views/
在springMvc.xml文件中引入下面的代碼既即以在 該容器內通過@Value("${web.view.prefix}")獲取這個字符串。需要指出的是,如果只在springMvc.xml引入下面代碼,只能在springMvc.xml文件中掃描或者註冊的bean中才能通過@Value("${web.view.prefix}")獲取這個字符串,其他未在springMvc.xml掃描和定義的bean必須在相應的xml文件中引入下面代碼才能使用@Value("${}”)表達式
145、json數據亂碼
在springMVC controller中返回json數據出現亂碼問題,因爲沒有進行編碼,只需要簡單的註解就可以了
在@RequestMapping()中加入produces="text/html;charset=UTF-8"屬性即可,如下:
146\ RequestMapping URL路徑映射
@RequestMapping(value="item")或@RequestMapping("/item")
value的值是數組,可以將多個url映射到同一個方法@RequestMapping(value = { "itemList", "itemListAll" })
147\RequestMapping除了可以對url進行設置,還可以限定請求進來的方法
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通過POST訪問則報錯:
HTTP Status 405 - Request method 'POST' not supported
例如:
@RequestMapping(value = "itemList",method = RequestMethod.POST)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通過GET訪問則報錯:
HTTP Status 405 - Request method 'GET' not supported
GET和POST都可以
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})
148\ Controller返回void
在Controller方法形參上可以定義request和response,使用request或response指定響應結果:
1、使用request轉發頁面,如下:
request.getRequestDispatcher("頁面路徑").forward(request, response); request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);
2、可以通過response頁面重定向:
response.sendRedirect("url") response.sendRedirect("/springmvc-web2/itemEdit.do");
3、可以通過response指定響應結果,例如響應json數據如下:
response.getWriter().print("{\"abc\":123}");
149\ Redirect重定向
Contrller方法返回字符串可以重定向到一個url地址
如下商品修改提交後重定向到商品編輯頁面。
@RequestMapping("updateItem") public String updateItemById(Item item) { // 更新商品 this.itemService.updateItemById(item); // 修改商品成功後,重定向到商品編輯頁面 // 重定向後瀏覽器地址欄變更爲重定向的地址, // 重定向相當於執行了新的request和response,所以之前的請求參數都會丟失 // 如果要指定請求參數,需要在重定向的url後面添加 ?itemId=1 這樣的請求參數 return "redirect:/itemEdit.do?itemId=" + item.getId(); }
150\ forward轉發
Controller方法執行後繼續執行另一個Controller方法
如下商品修改提交後轉向到商品修改頁面,修改商品的id參數可以帶到商品修改方法中。
@RequestMapping("updateItem") public String updateItemById(Item item) { // 更新商品 this.itemService.updateItemById(item); // 修改商品成功後,繼續執行另一個方法 // 使用轉發的方式實現。轉發後瀏覽器地址欄還是原來的請求地址, // 轉發並沒有執行新的request和response,所以之前的請求參數都存在 return "forward:/itemEdit.do"; }
//結果轉發到editItem.action,request可以帶過去
return "forward: /itemEdit.do";