1. 程式人生 > >SSM專案總結

SSM專案總結

文章目錄

1.Mybatis關聯查詢時,查到物件但物件屬性為null

  • 原因:沒有對映相關列,或者在資料查詢時沒有關聯相關表。Mybatis封裝物件時,需要先從資料庫查到相關列再封裝為物件。
//RoleMapper.xml
<resultMap id="BaseResultMap" type="entity.Role">
	//對映主鍵
    <id column="ROLE_ID"  property="roleId" />
    <result column="NAME"  property="name" />
    //對映實體中的List集合
    <-- select="mapper.ModuleMapper.findModuleByRoleId":此處為對映相關Mapper中的方法,全限定名 -->
    <collection property="modules" select="mapper.ModuleMapper.findModuleByRoleId" column="ROLE_ID">
  	</collection>
 </resultMap>
  
  //ModuleMapper.xml
  <mapper namespace="mapper.ModuleMapper">
  <resultMap id="BaseResultMap" type="entity.Module">
    <id column="MODULE_ID" jdbcType="DECIMAL" property="moduleId" />
    <result column="NAME" jdbcType="VARCHAR" property="name" />
  </resultMap>

2.Mybatis的批量刪除的sql語句的寫法

<!-- 刪除並不是真的刪除,只是把狀態改為2 -->
    <delete id="deleteByRecommenderId" parameterType="hashmap">
    	update account set status = #{status},
			pause_date=null,
			close_date=SYSDATE
			where account_id in 
			<!-- map:Collection也是使用集合名 -->
			<foreach collection="ids" item="id" open="("
				close=")" separator=",">
				#{id}	
			</foreach>
    </delete>

3.Junit測試方法中正常,但到Controller層出錯

  • 原因是沒加@Autowired註解或者配置檔案中沒有注入相應的Bean

4.SpringMVC中引數為Map

  • 進入Controller方法中時,要封裝的方法引數為Map時要加@RequestParam註解。

5.Restful方式進行狀態修改

			//JSP頁面
			//開通
            function start_account(id) {
            	var r = window.confirm("確定要開通此賬務賬號嗎?");
            	if(r) {
            		location.href = "${pageContext.request.contextPath}/account/startAccount/"+id;
            	}
            }
            
            //暫停
            function pause_account(id) {
            	var r = window.confirm("確定要暫停此賬務賬號嗎?");
            	if(r) {
            		location.href = "${pageContext.request.contextPath}/account/pauseAccount/"+id;
            	}
            }
      /**
	 * 啟動帳號
	 * @PathVariable("recommenderId"):此註解作用獲取路徑上的請求引數
	 * @param recommenderId
	 * @return
	 */
	@RequestMapping(value="/startAccount/{recommenderId}",method=RequestMethod.GET)
	public String startAccount(@PathVariable("recommenderId")Integer recommenderId){
		as.updateStatus(recommenderId, "0");
		return "redirect:/account/findAccount";
	}
	
	/**
	 * 暫停帳號
	 * @param recommenderId
	 * @return
	 */
	@RequestMapping(value="/pauseAccount/{recommenderId}",method=RequestMethod.GET)
	public String pauseAccount(@PathVariable("recommenderId")Integer recommenderId){
		as.updateStatus(recommenderId, "1");
		//暫停account帳號時,同步暫停其下屬的service帳號
		sm.pauseByAccount(recommenderId);
		return "redirect:/account/findAccount";
	}

6.Mybatis的關聯查詢

  • 三表關聯
	
	<!-- 一個管理員可以擁有多個角色  -->
	<resultMap id="adminResultMap" type="admin">
		<id column="admin_id" property="admin_id" />
		<collection ofType="role"
			//property:實體類中對映的集合名
			//javaType:集合roles的型別
			//column:通過哪一列關聯,指資料庫中的列名
			//select:查詢的方法
			property="roles" javaType="java.util.ArrayList" column="admin_id"
			 select="selectRolesByAdmin">
		</collection>
	</resultMap>
	
	/**
	 * sql查詢語句
	 */
	<select id="findByPage" parameterType="adminQueryBean"  resultMap="adminResultMap">
		select * from (
			select a.*,ROWNUM r from (
				select * from admin_info
				where admin_id in (
					select a.admin_id
					from admin_info a 
					join admin_role ar on a.admin_id=ar.admin_id
					join role_info ri on ri.role_id=ar.role_id
					join role_module rm on rm.role_id=ri.role_id
					<where>
						<if test="roleName!=null &amp;&amp; roleName.length()>0">
							and instr(ri.name,#{roleName})>0
						</if>
						<if test="moduleId!=null">
							and rm.module_id=#{moduleId}
						</if>
					</where>
				)
				order by admin_id
			) a where ROWNUM&lt;=#{end}
		) where r&gt;=#{begin}
	</select>
	<!-- 關聯查詢管理員擁有的所有角色,就是adminResultMap中Collections中對映的方法  -->
	<select id="selectRolesByAdmin"  parameterType="int"  resultType="role">
		select * from role_info where role_id in (
			select role_id from admin_role
			where admin_id=#{id}
		)
	</select>
	<!-- 關聯查詢Role下面的所有Module  -->
	<resultMap id="roleMap" type="role">
		<id column="role_id" property="role_id" />
		<collection ofType="module" 
			property="modules" column="role_id" select="selectModulesByRoleId">
		</collection>
	</resultMap>
	<!-- 通過role_id查詢該role_id擁有的所有mudule -->
	<select id="selectModulesByRoleId" 
		parameterType="int" 
		resultType="module">
		select * from module_info where module_id in (
			select module_id from role_module
			where role_id=#{role_id}
		)
	</select>
	先查詢到Admin,然後在ResultMap通過admin_id(資料庫中的列名)關聯查詢所擁有的Role
	再通過RoleMapper.xml中的ResultMap關聯查詢Module

7.SpringMVC的登陸攔截和許可權驗證

  • 1.在登入的Controller層將登入的使用者新增到session中
  • 2.將admin所擁有的許可權放到session中
   @RequestMapping("/login.do")
   @ResponseBody
   public Map<String, Object> login(String adminCode,String password,String code,HttpSession session) {
   	Map<String, Object> result = new HashMap<String, Object>();
   	//imageCode:生成的驗證碼
   	String imageCode = (String) session.getAttribute("imageCode");
   	//code:輸入的驗證碼,判斷與生成的是否一致
   	if(code == null
   			|| !code.equalsIgnoreCase(imageCode)) {
   		result.put("flag", IMAGE_CODE_ERROR);
   		return result;
   	}
   	//校驗帳號:adminCode:帳號
   	Admin admin = am.findByCode(adminCode);
   	if(admin == null) {
   		result.put("flag", ADMIN_CODE_ERROR);
   		return result;
   		//校驗密碼:
   	} else if (!admin.getPassword().equals(password)) {
   		result.put("flag", PASSWORD_ERROR);
   		return result;
   	} else {
   		//登入成功把admin物件放到session中
   		session.setAttribute("admin", admin);
   		//檢視當前登入使用者擁有的所有許可權(即模組):
   		//儲存到session當中
   		//許可權校驗需要:
   		List<Module> modules = am.findModulesByAdmin(admin.getAdmin_id());
   		session.setAttribute("allModules", modules);
   		result.put("flag", SUCCESS);
   		return result;
   	}
   }
   //進入目標controller之前
   //登入攔截,判斷session中是否含使用者,有的話放行,沒有跳轉到登入頁面。
   //因為如果已經登入後的話Controller中已經將使用者新增到session中了
   @Override
   public boolean preHandle(HttpServletRequest request,
   		HttpServletResponse response, Object obj) throws Exception {
   	System.err.println("loginIntercptor");
   	Admin admin = (Admin) request.getSession().getAttribute("admin");
   	if(admin == null) {
   		response.sendRedirect(
   				//request.getContextPath():獲取絕對路徑
   			request.getContextPath() + "/login/toLogin.do");
   		//阻止請求
   		return false;
   	} else {
   		//http://localhost:8080/NetCtoss/role/findRoles.do
   		//return true:放行請求
   		return true;
   	}
   }
   //許可權攔截,此攔截器作用是獲取要訪問的模組許可權,並將模組許可權對應的數字新增到session,與後面攔截器中使用者擁有的許可權進行比對
   @Override
   public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object obj) throws Exception {
   	// 判斷當前使用者訪問的模組
   	//獲取請求地址
   	String url = request.getRequestURL().toString();
   	System.err.println("url=" + url);
   	int currentModule = 0; // 預設0是NETCTOSS首頁,登入
   	//通過url是否包含要判斷訪問的模組,並將訪問模組對應的數字新增到session中,在下個攔截器中進行比對
   	if (url.contains("role")) {
   		currentModule = 1;
   	} else if (url.contains("admin")) {
   		currentModule = 2;
   	} else if (url.contains("cost")) {
   		currentModule = 3;
   	} else if (url.contains("account")) {
   		currentModule = 4;
   	} else if (url.contains("service")) {
   		currentModule = 5;
   	}
   	request.getSession().setAttribute("currentModule", currentModule);
   	//把請求放行到下一個攔截器處理
   	return true;
   }
   
   //進行許可權驗證,在上個攔截器中已經添加了要訪問的模組到session中
   //此攔截器作用是將要訪問的模組許可權與此使用者所用的許可權模組進行比對,如果包含允許訪問,否則不準。
   @SuppressWarnings("unchecked")
   @Override
   public boolean preHandle(HttpServletRequest request,
   		HttpServletResponse response, Object obj) throws Exception {
   	//獲取登入使用者有許可權的所有模組
   	List<Module> modules = (List<Module>) 
   			request.getSession().getAttribute("allModules");
   	//獲取使用者當前要訪問的模組
   	int currentModule = (Integer) 
   			request.getSession().getAttribute("currentModule");
   	System.err.println("currentModule : " + currentModule);
   	//判斷使用者有許可權的模組是否包含當前模組
   	for (Module module : modules) {
   		if (module.getModule_id() == currentModule) {
   			//有當前訪問模組的許可權
   			//放行到Controller中
   			return true;
   		}
   	}
   	//沒有當前訪問模組的許可權
   	response.sendRedirect(
   			request.getContextPath() + "/login/nopower.do");
   	return false;
   }