1.返回原頁面的方式:
2.使用@RequestMapping中的大多數情況下填寫的value是路徑,然後若方法上沒有加@ResponseBody,則返回的是值會解析爲請求路徑,加上@ResponseBody則可以獲得json數據。
3.公司常用一些東西:
=>項目右鍵->find brugs
=>postman
=>rap
4.Spring中的@Transactional(rollbackFor = Exception.class)事務處理,當你的方法中拋出異常時,它會將
事務回滾,數據庫中的數據將不會改變,也就是回到進入此方法前的狀態。
5.儘量不要使用前臺分頁,可能會造成在分頁顯示之後,數據庫數據修改但表格並未動,造成拋出異常的情況。基本上都需要使用後臺分頁。這裏使用Mybatis的後臺分頁。
controller層:
serviceImpl層:
6.除了是返回頁面外,返回數據儘量不要出現直接返回數據,而是使用寫好的某個業務Result類的對象去返回到頁面,這樣做的好處是代碼適應性強,可適應App類應用。
下面這個代碼返回的是一個list,這種方式是不太規範的。
而是應寫成如下的這種形式:
BroadcastResult類詳細信息如下,這樣做的目的是爲了返回其他一些狀態信息:
package cn.wtu.broadcast.parent.pojo;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class BroadcastResult implements java.io.Serializable {
private static final long serialVersionUID = 1L;
// 定義jackson對象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 響應業務狀態
private Integer status;
// 響應消息
private String msg;
// 響應中的數據
private Object data;
public BroadcastResult() {
}
public BroadcastResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public BroadcastResult(Object data) {
this.status = 200;
this.msg = "操作成功";
this.data = data;
}
public static BroadcastResult build(Integer status, String msg, Object data) {
return new BroadcastResult(status, msg, data);
}
public static BroadcastResult ok(Object data) {
return new BroadcastResult(data);
}
public static BroadcastResult ok() {
return new BroadcastResult(null);
}
public static BroadcastResult fail() {
return new BroadcastResult(400, "操作失敗", null);
}
public static BroadcastResult fail(String msg) {
return new BroadcastResult(400, msg, null);
}
public static BroadcastResult build(Integer status, String msg) {
return new BroadcastResult(status, msg, null);
}
/**
* 將json結果集轉化爲BroadcastResult對象
*
* @param jsonData json數據
* @param clazz BroadcastResult中的object類型
* @return
*/
public static BroadcastResult formatToPojo(String jsonData, Class<?> clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, BroadcastResult.class);
}
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (clazz != null) {
if (data.isObject()) {
obj = MAPPER.readValue(data.traverse(), clazz);
} else if (data.isTextual()) {
obj = MAPPER.readValue(data.asText(), clazz);
}
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
/**
* 沒有object對象的轉化
*
* @param json
* @return
*/
public static BroadcastResult format(String json) {
try {
return MAPPER.readValue(json, BroadcastResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Object是集合轉化
*
* @param jsonData json數據
* @param clazz 集合中的類型
* @return
*/
public static BroadcastResult formatToList(String jsonData, Class<?> clazz) {
try {
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (data.isArray() && data.size() > 0) {
obj = MAPPER.readValue(data.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
7.項目開發中上傳svn需要忽視的文件
8.前臺代碼提交
$.ajax({
url : "${ctx}/broadcast/daily/addDailyBroadcast",
type : 'post',
success :function(data){
layer.msg(data.msg,{icon: 1});
$("#tab_daily").bootstrapTable('refresh');
$("input[name='fVolumeControl']").val("").focus();
}
});
/* $(".addDailyBroadCast").ajaxSubmit({
type: 'post', // 提交方式 get/post
url: '${ctx}/broadcast/daily/addDailyBroadcast', // 需要提交的 url
success:function(data){
layer.msg(data.msg,{icon: 1});
$("#tab_daily").bootstrapTable('refresh');
$("input[name='fVolumeControl']").val("").focus();
}
}); */
9.寫mapper.xml擴展文件的排序sql語言時,所有關聯的表名稱被替代,則之後只能使用那個替代名稱,否則會一直報錯,找不到該表。剛開始還犯了一個低級錯誤,把GROUP BY放在ORDER BY的後面了。
10.模糊查詢+把f_broadcast_type=0的放在最前面---mysql
<select id="querywaitingBroadCast" parameterType="java.util.Map"
resultMap="BaseResultMap">
SELECT
b.*,
t_d.f_dictionary_content as f_real_messageLevel
FROM b_broadcast_data b
LEFT JOIN t_dictionary t_d
ON b.f_message_level=t_d.f_id
WHERE b.f_delete_flag='0' AND b.f_state=#{code}
<if test="searchText!=null">
AND CONCAT(b.f_id, b.f_volume_control,b.f_create_time
,b.f_broadcast_area) LIKE '%' #{searchText} '%'
</if>
ORDER BY case when b.f_broadcast_type='0' then 0 else 1 end , b.f_message_level,b.f_sort
</select>
11.bootstrap中列屬性onCheck和onUncheck的使用
$('#tab_daily').bootstrapTable({
method: 'get',
sortable: true,
dataType: "json",
search: true, //是否顯示錶格搜索
columns: columns,
classes:'table-no-bordered',
url: "${ctx}/broadcast/daily/selectDailyBroadcast",
toolbar : '#toolbarComputer', // 工具按鈕用哪個容器
sortable : true, // 是否啓用排序
sortOrder : "desc", // 排序方式
pagination : true, // 是否顯示分頁(*)
pageNumber : 1, // 初始化加載第一頁,默認第一頁
pageSize : 5, // 每頁的記錄行數(*)
pageList : [5, 10, 20], // 可供選擇的每頁的行數(*)
showRefresh : true, // 是否顯示刷新按鈕
clickToSelect : true, // 是否啓用點擊選中行
uniqueId : "index", // 每一行的唯一標識,一般爲主鍵列表
sidePagination:'server',
queryParamsType: "",
queryParams: function (params) {//自定義參數,這裏的參數是傳給後臺的,我這是是分頁用的
return {//這裏的params是table提供的
pageNumber: params.pageNumber,//從數據庫第幾條記錄開始
pageSize: params.pageSize,//找多少條
searchText:params.searchText, //查詢內容
sortOrder:params.sortOrder, //排序方式
sortName:params.sortName, //排序名稱
};
},
responseHandler:function (result) {
daily_data=result.data.list;
if(result.status === 200){
//layer.close(ii);
}
return{
total: result.data.total,
rows: result.data.list
};
},
onCheck:function(row){
if(!(row.fState==1)){
$("#modifyBroadcastBtn").addClass("disabled");
$("#modifyBroadcastBtn").css("opacity",".4");
} else{
checkBtn();
}
},
onUncheck:function(row){
checkBtnUnClick();
}
});
function checkBtn(){
var checked= $('#tab_daily').bootstrapTable('getSelections');
if(checked.length>1){
$("#modifyBroadcastBtn").addClass("disabled");
$("#modifyBroadcastBtn").css("opacity",".4")
}
}
function checkBtnUnClick(){
var checked= $('#tab_daily').bootstrapTable('getSelections');
if(checked.length==0){
$("#modifyBroadcastBtn").removeClass("disabled");
$("#modifyBroadcastBtn").css("opacity","1")
} else if(checked.length==1){
if(checked[0].fState==1){
$("#modifyBroadcastBtn").removeClass("disabled");
$("#modifyBroadcastBtn").css("opacity","1")
}
}
}
12.路徑的問題
<%@include file="common/css.jsp" %>
<%@include file="../common/css.jsp" %>
../一般是回到上一級目錄,./一般很難出現在真實項目中,在項目中也不存在下面這種,一般開頭不帶/。
<%@include file="/common/css.jsp" %>
13.關於mapper.xml文件的問題
雖然可以在數據庫字段和VO開啓駝峯式的對應,但是還是自己使用AS取個別名對應就好。這裏注意不是resultMap,應該時resultType。
14.當使用模態框彈出時,然後點擊該模態框上的按鈕,打開一個layui的界面,可能會聚焦不了,無法填寫東西。
這是因爲在模態框中的tabindex樣式的影響,去掉模態框中的 tabindex="-1"就可以聚焦了。如下圖
15.模態框移動:
加上一句話就可以,$(".modal-dialog").draggable();,加載js初始化加載的任意一個地方就行。