1. 程式人生 > >UAP 從前端到後端 詳細教程 (五) 後端

UAP 從前端到後端 詳細教程 (五) 後端

首先配置問題,在配置檔案裡 新增包的掃描

把對應的註解了的類,解析為相應元件:

 配置檔案 命名規則為 xxxResource.xml ,我這裡叫 scanResource.xml.

包掃描,是掃描你的 controller 等類所在包位置

scanResource.xml 裡的 程式碼

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:module="http://www.sgcc.com.cn/schema/platform/module"
	xsi:schemaLocation="http://www.springframework.org/schema/beans     
	http://www.springframework.org/schema/beans/spring-beans.xsd    
	http://www.springframework.org/schema/context    
	http://www.springframework.org/schema/context/spring-context.xsd    
	http://www.sgcc.com.cn/schema/platform/module    
	http://www.sgcc.com.cn/schema/platform/module/module.xsd   
	http://www.springframework.org/schema/mvc    
	http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	<context:component-scan base-package="top.jacktu.controller" />
	<context:component-scan base-package="top.jacktu.bizc" />
</beans>

然後是程式碼結構,檢視.  我這裡沒怎麼用到 Emp 所以 有 Emp 字樣的 java類 你可以忽略它

bizc 是 業務邏輯層,controller 是對請求的處理方法. po 是放 javaBean 的.

===========================================================================================

================================== 分割線===================================================

實體類,Holiday.java

package top.jacktu.po;

import java.io.Serializable;
/** Holiday 實體類(JavaBean) */
public class Holiday implements Serializable {
	private static final long serialVersionUID = -2861040546555145433L;
	private int ID;
	private int USERID;
	private String REQUEST_DATE;
	private String REQUEST_REASON;
	private int REQUEST_DAYS;
	private int APPROVER_UID;
	private String STATE;
// .... 後面構造方法,toStrig,getter ,setter 什麼的省略了...

}

 HolidayControllr.java 控制器

package top.jacktu.controller;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import top.jacktu.bizc.IHolidayBizc;
import top.jacktu.po.Holiday;

import com.sgcc.uap.rest.annotation.ItemResponseBody;
import com.sgcc.uap.rest.annotation.QueryRequestParam;
import com.sgcc.uap.rest.annotation.VoidResponseBody;
import com.sgcc.uap.rest.support.QueryResultObject;
import com.sgcc.uap.rest.support.RequestCondition;
import com.sgcc.uap.rest.utils.RestUtils;

@Controller
@RequestMapping("/holiday")
public class HolidayController {
	@Autowired
	IHolidayBizc holidayBizc;

	/**
	 * 向前端返回 列表 有關資料
	 * 其中 PageIndex 和 PageSize 前端會自動反饋回來 
	 * 這樣接收,反饋對應 頁面的 資料就可以了 前端 (就是做一個分頁查詢)
	 * 每次 翻頁 都會 向這裡請求一次
	 */
	@RequestMapping("/list")
	public @ItemResponseBody
	Object getHolidayList(HttpServletRequest reqeust,
			@QueryRequestParam("params") RequestCondition param) {
		System.out.println(param.getPageIndex());
		System.out.println(param.getPageSize());
		System.out.println(param.getColumns());
		return holidayBizc.getHolidayList();
	}

	/** 前端載入元資料的請求地址,我這裡是空實現 和返回 */
	@RequestMapping("/list/meta")
	public @ItemResponseBody
	Object getHolidayListMeta(HttpServletRequest reqeust) {
		return "";
	}

	// {"ids":[2,3,4]} id 傳遞過來的形式
	// 通過這個刪除資料庫 裡的一些資料,實現操作
	@RequestMapping("/list/delete")
	public @VoidResponseBody
	Object delHoliday(HttpServletRequest reqeust,
			@RequestBody Map<String, List<String>> values) {
		holidayBizc.DeleteHolidayByIds(values.get("ids"));
		return null;
	}

	/** 新建一條記錄 時的預填資料,也就是彈出 新建 表單時的 ,資料返回 */
	@RequestMapping("/info/new")
	public @ItemResponseBody
	QueryResultObject newHoliday(HttpServletRequest reqeust,
			@ModelAttribute Holiday holiday) {
		Map<String, Object> map = holidayBizc.getNewInfo();
		// return RestUtils.wrappQueryResult(map);
		return RestUtils.wrappQueryResult(map);
	}

	/** 插入一條記錄 */
	@RequestMapping("/new")
	// ModelAttribute
	public @VoidResponseBody
	Object insertNewInfo(HttpServletRequest request,
			@ModelAttribute Holiday holiday) {
		holidayBizc.insertOneHoliday(holiday);
		return null;
	}

	/** 點選編輯時的事件,彈出表單請求資料 時 ,資料返回 */
	@RequestMapping("/info/{id}")
	public @ItemResponseBody
	QueryResultObject getHolidayInfo(HttpServletRequest reqeust,
			@PathVariable Integer id, @RequestParam("params") String param) {
		Map<String, Object> map = holidayBizc.getInfoById(id);
		return RestUtils.wrappQueryResult(map);
	}

	/** 儲存對 假期的修改 */
	@RequestMapping("/saveEdit")
	// ModelAttribute
	public @VoidResponseBody
	Object saveEdit(HttpServletRequest request, @ModelAttribute Holiday holiday) {
		holidayBizc.saveEdit(holiday);
		return null;
	}
}

HolidayBizc.java

package top.jacktu.bizc;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import top.jacktu.po.Holiday;

import com.sgcc.uap.persistence.IHibernateDao;
import com.sgcc.uap.rest.support.QueryResultObject;
import com.sgcc.uap.rest.utils.RestUtils;
/**
 * 這個時 業務層(邏輯實現),又可以直接呼叫一些API 但是我沒用.
 * 作為演示,很多sql 語句都是自己編寫的.
 * @author jacktu
 *
 */
@Service
public class HolidayBizc implements IHolidayBizc{
	
	@Autowired
	IHibernateDao hibernateDao;
	 // 獲取表單資料,這裡要做一個 分頁查詢.
	//我這裡沒有寫,需要自己 根據 pageIndex 與 pageSize實現
	@Override
	public QueryResultObject getHolidayList() {
		String sql = "select " +
				"ID,"+
				"USERID,"+
				"TO_CHAR(REQUEST_DATE,'YYYY-MM-DD') REQUEST_DATE,"+
				"REQUEST_REASON,"+
				"REQUEST_DAYS,"+
				"APPROVER_UID,"+
				"STATE"+
				" from holiday";
		@SuppressWarnings("unchecked")
		List<Map<String, Object>> list = 
				hibernateDao.queryForListWithSql(sql);
		/**					list後面那個10 是分頁查詢的一個重要資訊.前端會根據這個顯示有多少頁*/
		return RestUtils.wrappQueryResult(list,10);
	}
	@Override
	public void DeleteHolidayByIds(List<String> ids) {
		String sql = "DELETE FROM HOLIDAY WHERE ID IN (?)";
		sql = sql.replace("?",ids.toString().replace("[", "").replace("]", ""));
		hibernateDao.updateWithSql(sql);
	}
	// 儲存編輯後的資料 時,邏輯實現
	@Override
	public void saveEdit(Holiday holiday) {
		String sql = "UPDATE holiday SET " +
				"USERID=?"+
				",REQUEST_DATE=TO_DATE(?,'YYYY-MM-DD')"+
				",REQUEST_REASON=?"+
				",REQUEST_DAYS=?"+
				",APPROVER_UID=?"+
				",STATE=?"+
				" WHERE id=?";
		Object data [] = {
				holiday.getUSERID(),
				holiday.getREQUEST_DATE().replace("00:00:00", ""),
				holiday.getREQUEST_REASON(),
				holiday.getREQUEST_DAYS(),
				holiday.getAPPROVER_UID(),
				holiday.getSTATE(),
				holiday.getID()};
		try {
			System.out.println("開始執行sql");
			hibernateDao.updateWithSql(sql,data);
			System.out.println("執行完畢,over");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	// 編輯時 的資料返回
	@Override
	public Map<String, Object> getInfoById(Integer id) {
		String sql = "SELECT * FROM holiday WHERE ID=?";
		@SuppressWarnings("unchecked")
		List<Map<String, Object>> list = 
			hibernateDao.queryForListWithSql(sql,new Object[]{id});
		return list.get(0);
	}
	/** 插入一條資料的 邏輯實現 */
	@Override
	public void insertOneHoliday(Holiday h) {
		System.out.println("we do nothing but we pretend to do so much thing.");
		String sql = "insert into holiday values(?,?,TO_DATE('"
				+h.getREQUEST_DATE().substring(0, 10)+"','YYYY-MM-DD'),?,?,?,?)";
		Object [] aobj = new Object[]{
			h.getID(),h.getUSERID(),h.getREQUEST_REASON(),h.getREQUEST_DAYS()
			,h.getAPPROVER_UID(),h.getSTATE()
		};
		hibernateDao.updateWithSql(sql, aobj);
	}
	// 新建時反饋的資訊
	@Override
	public Map<String, Object> getNewInfo() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ID", getMaxID("holiday")+1);
		map.put("USERID", "2");
		map.put("REQUEST_DATE", new Date());
		map.put("REQUEST_REASON", "例:身體不舒服,想去醫院看看.");
		map.put("REQUEST_DAYS", "3");
		map.put("APPROVER_UID", "1");
		map.put("STATE", "待批准");
		return map;
	}
	/** 獲取最大 的 ID,實現自增. 但是我們組不是這樣的,這裡只是示範 */
	private int getMaxID(String string) {
		String sql = "select max(ID) from holiday";
		int maxInt = hibernateDao.queryForIntWithSql(sql);
		return hibernateDao.queryForIntWithSql(sql);
	}
	
}

基本就這些,程式碼粘過去哪裡不能實現.自行解決吧,應該也不會有什麼大問題.

相關推薦

UAP 前端 詳細教程 ()

首先配置問題,在配置檔案裡 新增包的掃描 把對應的註解了的類,解析為相應元件:  配置檔案 命名規則為 xxxResource.xml ,我這裡叫 scanResource.xml. 包掃描,是掃描你的 controller 等類所在包位置 scanResourc

PHP基礎到高階詳細教程(完整版)

PHP基礎變數命名     變數型別    引用賦值型別   範圍    引號   字串連線符    自動(強制)轉換    判斷變數型別運算子   自增自減    三元運算子    優先順序if  switch  for  while    四個跳出的區別形參   實參  

Centos6.8原始碼安裝Gitlab詳細教程

本人用的是1核2G的阿里雲伺服器,從原始碼安裝Gitlab中文版(英文版的安裝幾乎沒有差別,下詳)。安裝過程對於像我這樣的新手來說十分艱辛,中間遇到不少問題,但功夫不負有心人,最終還是安裝成功了。現分享安裝步驟。 各位覺得麻煩,建議用官網推薦的Omnibus 安裝方式。 安

Vue2+Koa2+Typescript前後框架教程--02KOA2框架自動重啟編譯服務(nodemon)

上一篇講完搭建Typescritp版的Koa框架後,F5執行服務端,頁面進行正常顯示服務。 今天要分享的是,如果要修改服務端程式碼,如果讓編譯服務自動重啟,免去手動結束服務再重啟的過程。 自動重啟服務需要使用nodemon工具。nodemon可以自動檢測到目錄中的檔案更改時,通過重新啟動應用程式來除錯基於no

Vue2+Koa2+Typescript前後框架教程--03路由和三層模式配置

昨天將Koa2的基礎框架和自動編譯除錯重啟服務完成,今天開始配置路由和搭建基礎的三層架構模式。 路由中介軟體:koa-router,即路由導航,就是我們平時使用最廣泛的get/post方法執行的URL路徑,其全部包括get、put、post、patch、delete、del,通過訪問路徑,指向不同的模組,指向

Web開發前端、程式語言、到框架的初學指南

[導讀] 作為一篇Web開發初學者指南,本文從學習什麼出發到如何專攻。從前端、後端,到程式語言,再到框架,或許對打算進軍Web開發的您有所幫助。如果你正在閱讀這篇文章,你可能是對Web開發有某種興趣,甚至你開始想去學 作為一篇Web開發初學者指南,本文從學習什麼

【】前端(html)向(ashx)傳輸資料

整體思路: 想要從前端傳輸資料到後端,大體分三步:首先要從前端獲取值,然後用ajax的方式傳輸到後端,接著在後端接收資料 我這裡實現的是從html頁傳資料到ashx中使用 詳細實現: 1、從前端獲取值

angularJs 前端 json 串傳參

<%@ page language="java" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme(

Ajax如何實現前端不重新整理頁面就可以到取到資料

        提到axaj很多人總說很難,什麼回撥函式呀等等就讓人心煩,其實懂得ajax在js裡面是如何實現向伺服器請求資料的原理,那麼理解ajax也就不是很難了,現在我們一起來看看。          ajax作用:ajax技術的目的是讓javascript傳送http請求,與後臺通訊,獲取資料和資訊。實

前端兩個角度分析jsonp跨域訪問(完整例項)

一、什麼是跨域訪問 舉個栗子:在A網站中,我們希望使用Ajax來獲得B網站中的特定內容。如果A網站與B網站不在同一個域中,那麼就出現了跨域訪問問題。你可以理解為兩個域名之間不能跨過域名來發送請求或者請求資料,否則就是不安全的。跨域訪問違反了同源策略,同源策略的詳

jquery中ajax 前端 完整過程解析

幾個原則: 1.get方式訪問瀏覽器時,常加引數緣由: GET訪問瀏覽器是等冪的,就是一個相同的URL只有一個結果[相同是指整個URL字串完全匹配],所以第二次訪問的時候如果 URL字串沒變化,瀏覽器是 直接拿出了第一次訪問的結果。POST則認為是一個變動性訪問 (瀏覽器認為POST的提交必定是有改變的)

【面試】Web效能優化前端

效能優化 效能優化無非是,優化使用者體驗,減少網頁反應時間。原來在web效能優化書上看過 總的來分減少傳輸距離,減少傳輸量。具體從前端到後端來說 1、後端 存取速度原則是暫存器 > 記憶體 > 磁碟 1)操作資料庫耗時 2)存取檔案

Git到GitHub,詳細教程

文件夾 想象 可能 機制 安裝完成 公開 style run 離線 眾所周知,一個稍微有點規模的項目,都不可能是一個人單打獨鬥完成的(能完成的大神別打我),所以,一個高效的項目團隊就需要一個NB的工具來進行有效的交流(曾經有人問我企鵝不就可以嗎,我竟無言以對),今天就把我學

跨域cors中如何傳遞cookie(前端為什麽無法向傳遞cookie?)

con sam bsp ble 情況 需求 nbsp 什麽 gin 沒有跨域 後端server只要在回應頭部‘set-cookie’,那麽就會有cookie產生並保存在客戶端client。 等到client再次向後端server發送請求時瀏覽器的機制就會自動攜帶cook

前端js上傳文件C#接收文件

rec anon res owa markdown 接收 post filename ted 本文粗略的講下前端文件上傳和後端文件接收的原理 前端代碼 html <form onsubmit="uploadFile(event)"> <inp

前端imageBuffer設置圖片src(前端直傳buffer)

本質 string += array 前端 arr mage 設置圖 toa 本質為buffer轉base64 let bytes = new Uint8Array(imageBuffer.data); let data = ""; let len = bytes.byte

PHP PC微信掃碼支付【模式二】詳細教程-附帶源碼(轉)

idt class pid 方法 按鈕 -c 商戶 開源 玩意兒 博主寫這破玩意兒的時候花了大概快兩天時間才整體的弄懂邏輯,考慮了一下~還是把所有代碼都放出來給大家~抱著開源大無私的精神!誰叫我擅長拍黃片呢?同時也感謝我剛入行時候那些無私幫過我的程序員們! 首先還是

前端入門教程()CSS樣式初見

閃爍 set key 缺陷 cad -c 入門教程 clas 需要 一 什麽是CSS CSS全稱Cascading Style Sheet層疊樣式表,是專用用來為HTML標簽添加樣式的。 樣式指的是HTML標簽的顯示效果,比如換行、寬高、顏色等等 層疊屬於CSS的三大

shop--11.前端展示系統--店鋪列表(

ima mod col lmap eat time false ans rom 按照頁面原型設計 點擊全部商店後加載一級商鋪列表,加載對應的數據 點擊特定的一級商鋪列表,加載對應商鋪列表下的數據 區域顯示全部區域 店鋪列表頁面需要支持

shop--11.前端展示系統--店鋪詳情(

agen ddr .data lin 父類 body 不能 color header 大多與店鋪列表展示頁面相同 shopdetail.html <!DOCTYPE html> <html> <head> &l