Spring3 MVC 教程 (Mybatis+ExtJS基本權限管理)
Spring3 MVC 教程 (Mybatis+ExtJS基本權限管理)
說明:
- 驗證碼:采用開源的https://code.google.com/p/kaptcha/,代碼自己修改了部分。
- 上傳文件:swfupload,參考論壇里面的另外一個帖子。
- ext的tab非iframe模式,只加載一次ExtJS,速度還可以~自己命名jsp里面的變量的時候注意變量ID不要重復 參加下面部分js代碼
- 框架采用了mybatis+spring3MVC,應該說是學習springmvc的好例子。代碼都有詳細注釋。
- js的加載采用了yepnope,是一個基于條件的異步資源(JS和CSS)加載工具
- mybatis的配置文件的生成采用了自己修改的mybatis的工具。mybatis-generator 修改版
其他:
附件為maven構建的工程,需要lib的可以去網盤下載,里面也有base_power.pdm文件,可以自己轉為mysql的腳本。
建庫語句在war包里面的readme文件夾下面
7z的分卷壓縮老是搞不好,只好貼網盤地址了
http://dl.dbank.com/c0bakwliui
// tab主面板
index.tabPanel = new Ext.TabPanel({
id: 'mainTabPanel',
region: 'center',
activeTab: 0,
deferredRender: false,
enableTabScroll: true,
// bodyStyle:'height:100%',
defaults: {
layout: 'fit',
autoScroll: true
},
plugins: new Ext.ux.TabCloseMenu({
closeTabText: '關閉標簽頁',
closeOtherTabsText: '關閉其他標簽頁',
closeAllTabsText: '關閉所有標簽頁'
}),
items: [{
id: 'home',
title: '我的主頁',
iconCls: 'home',
closable: false,
autoScroll: true,
autoLoad: {
url: index.welcome,
scripts: true,
nocache: true
}
}],
listeners: {
'bodyresize': function (panel, neww, newh) {
// 自動調整tab下面的panel的大小
var tab = panel.getActiveTab();
var centerpanel = Ext.getCmp(tab.id + "_div_panel");
if (centerpanel) {
centerpanel.setHeight(newh - 2);
centerpanel.setWidth(neww - 2);
}
}
}
});
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/WEB-INF/views/commons/taglibs.jsp"%>
<div id="changePwdDiv" style="width: 100%; height: 100%;">
<div id="changePwdToolBarDiv"></div>
<div id="changePwdFormDiv"></div>
</div>
<script type="text/javascript">
$(document).ready(function() {
//yepnope("${ctx}/resources/js/user/changepwd.js");
Ext.ns("Ext.Authority.changepassword"); // 自定義一個命名空間
changepwd = Ext.Authority.changepassword; // 定義命名空間的別名
changepwd = {
changeurl : ctx + "/user/changepwd"
};
// 編輯用戶Form
changepwd.changePwdFormPanel = new Ext.form.FormPanel({
renderTo : 'changePwdFormDiv',
border : false,
defaults : {
xtype : "textfield",
labelWidth : 50
},
bodyStyle : 'padding:5px;background-color:transparent;',
items : [ {// 原密碼
id : 'old_password',
name : 'old_password',
inputType : "password",
fieldLabel : '原密碼',
anchor : '99%',
allowBlank : false,
maxLength : 32
}, { // 新密碼
id : 'new_password',
name : 'new_password',
inputType : "password",
fieldLabel : '新密碼',
anchor : '99%',
allowBlank : false,
maxLength : 32
}, {// 確認密碼
id : 'compare_password',
name : 'compare_password',
inputType : "password",
fieldLabel : '確認密碼',
vtype : "password",// 自定義的驗證類型
vtypeText : "兩次輸入的密碼不一致!",
confirmTo : "new_password",// 要比較的另外一個的組件的id
anchor : '99%',
allowBlank : false,
maxLength : 32
}, {// 賬戶ID
xtype : 'hidden',
name : 'userId',
value : '${user.userId}'
} ]
});
// 工具欄
changepwd.changePwdToolbar = new Ext.Toolbar({
renderTo : 'changePwdToolBarDiv',
items : [ new Ext.Button({
text : '保存',
iconCls : 'save',
handler : function() {
var form = changepwd.changePwdFormPanel.getForm();
if (form.isValid()) {
var values = form.getValues();
// 發送請求
Share.AjaxRequest({
url : changepwd.changeurl,
params : {
oldPassword : Ext.MD5(values.old_password),
newPassword : Ext.MD5(values.new_password),
comparePassword : Ext.MD5(values.compare_password),
userId : values.userId
},
callback : function(json) {
// 重新登錄
Share.getWin().location = ctx;
},
falseFun : function(json) {//失敗后想做的個性化操作函數
if (json.msg.indexOf('原密碼不正確!請重新輸入') > -1) {
$("#old_password").focus().val('');
return;
}
if (json.msg.indexOf('兩次輸入的新密碼不一致') > -1) {
$("#new_password").val('');
$("#compare_password").val('').focus();
return;
}
if (json.msg.indexOf('請輸入正確的帳號和其注冊郵箱') > -1) {
return;
}
}
});
}
}
}), new Ext.Button({
text : '取消',
iconCls : 'cancel',
handler : function() {
header.changePwdWindow.close();
}
}) ]
});
var events = "beforecopy beforepaste beforedrag contextmenu selectstart drag paste copy cut dragenter";
$("#old_password").bind(events, function(e) {
if (e && e.preventDefault)
e.preventDefault();
else
window.event.returnValue = false;
return false;
});
$("#new_password").bind(events, function(e) {
return false;
});
$("#compare_password").bind(events, function(e) {
return false;
});
});
</script></pre>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<!-- 只搜索@Controller 標注的類 不搜索其他標注的類 -->
<context:component-scan base-package="com.chenxin.authority" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- controller層的屬性和配置文件讀入 ,多個用逗號隔開 <context:property-placeholder location="classpath:/config/others/config.properties" /> -->
<!-- 應用屬性文件讀入 -->
<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!-- 標準配置 -->
<value>classpath:/config/others/config.properties</value>
<value>classpath:/config/ibatis/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 用于持有applicationProperties,將properties轉變為靜態方法使用,PropertiesHolder.getProperty("somekey") -->
<bean class="com.chenxin.authority.common.utils.PropertiesHolder">
<property name="properties" ref="applicationProperties" />
</bean>
<!-- PropertyPlaceholderConfigurer,用于spring ${placeholder}的解析 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="properties" ref="applicationProperties" />
</bean>
<!-- 激活 @Required @Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等標注 -->
<context:annotation-config />
<!-- 對某些靜態資源,如css,圖片等進行過濾 ,有引用 "/resources/**" 的路徑引用轉到工程的/resources/目錄取資源 -->
<!-- <mvc:resources mapping="/favicon.ico" location="/favicon.ico"/> -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- 簡單的地址映射 -->
<!-- Forwards requests to the "/" resource to the "welcome" view
<mvc:view-controller path="/admin" view-name="/admin/login" />
-->
<mvc:annotation-driven />
<!-- Configures support for @Controllers <mvc:annotation-driven/>相當于注冊了DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter兩個bean,配置一些messageconverter。即解決了@Controller注解的使用前提配置。
如果不用這個,則要聲明下面2個bean
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
</list>
</property>
</bean>
-->
<!--
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
攔截器注冊 -->
<!-- <property name="interceptors">
<bean class="com.company.project.common.springmvc.interceptor.SharedRenderVariableInterceptor"/>
</property>
</bean>
-->
<!-- jsp視圖 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 針對類、方法級別的權限攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- <mvc:mapping path="/fileupload" /> -->
<mvc:mapping path="/main*" />
<mvc:mapping path="/header*" />
<mvc:mapping path="/welcome*" />
<mvc:mapping path="/treeMenu*" />
<mvc:mapping path="/role**/**" />
<mvc:mapping path="/user**/**" />
<mvc:mapping path="/module**/**" />
<mvc:mapping path="/field**/**" />
<bean class="com.chenxin.authority.web.interseptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!--開發期間注釋掉,上線后啟用 錯誤解析器 發生錯誤默認會跳轉到/web-inf/views/timeout.jsp -->
<!-- <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"
value="timeout" /> <property name="exceptionMappings"> <props> <prop key="java.sql.SQLException">timeout</prop> <prop key="java.lang.RuntimeException">timeout</prop>
<prop key="org.springframework.transaction.TransactionException">timeout</prop> <prop key="org.springframework.dao.DataAccessException">timeout</prop>
</props> </property> </bean> -->
<!-- 國際化,并且可以批定文件編碼,可以使用classpath: 或者WEB-INF/ 前綴 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/config/others/messages</value>
<value>classpath:ValidationMessages</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
<property name="cacheSeconds" value="60" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
<!-- 文件上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 解析request的編碼 ,Default is ISO-8859-1 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 設置最大允許的大小(字節)。-1表示沒有限制(默認) 1024*1024*10=10MB -->
<property name="maxUploadSize" value="1048576000" />
<!--被允許的最大的內存的大小,Default is 10240 bytes -->
<property name="maxInMemorySize" value="20480" />
<!-- 一個類似懶加載的屬性.可以定義該屬性.讓解析文件的時候再拋異常,然后Controller中定義異常處理的方法 -->
<property name="resolveLazily" value="true" />
</bean>
</beans></pre>代碼不多貼了,上圖片吧。
authority.rar
轉自:
http://www.iteye.com/topic/1119744