Spring3 MVC 教程 (Mybatis+ExtJS基本权限管理)
jopen
13年前
Spring3 MVC 教程 (Mybatis+ExtJS基本权限管理) <br /> 说明: <br /> <br /> <ul> <li>验证码:采用开源的https://code.google.com/p/kaptcha/,代码自己修改了部分。</li> <li>上传文件:swfupload,参考论坛里面的另外一个帖子。</li> <li><strong>ext的tab非iframe模式,只加载一次ExtJS,速度还可以~自己命名jsp里面的变量的时候注意变量ID不要重复 </strong>参加下面部分js代码</li> <li>框架采用了mybatis+spring3MVC,应该说是学习springmvc的好例子。代码都有详细注释。</li> <li>js的加载采用了yepnope,是一个基于条件的异步资源(JS和CSS)加载工具</li> <li>mybatis的配置文件的生成采用了自己修改的mybatis的工具。<a href="/misc/goto?guid=4959500713337109868" target="_blank">mybatis-generator 修改版</a> </li> <br /> </ul> <br /> <br /> 其他: <br /> 附件为maven构建的工程,需要lib的可以去网盘下载,里面也有base_power.pdm文件,可以自己转为mysql的脚本。 <br /> 建库语句在war包里面的readme文件夹下面 <br /> 7z的分卷压缩老是搞不好,只好贴网盘地址了 <br /> <a href="/misc/goto?guid=4959500713532979011" target="_blank">http://dl.dbank.com/c0bakwliui</a> <pre class="brush:javascript; toolbar: true; auto-links: false;">// 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); } } } });</pre> <pre class="brush:javascript; toolbar: true; auto-links: false;"><%@ 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> <pre class="brush:xml; toolbar: true; auto-links: false;"><?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>代码不多贴了,上图片吧。 <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/f7af85f024f1dc8ee7abe8448ef963c2.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/1e36b6c1322b60119e73f4d36efe22ea.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/3b523a00737e2e097a453c37dad46a60.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/ee5acc23f4b2aff842dbc7d935d0cdde.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/f789317b893809316b9d89223b4b2d0e.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/229c413d7b694e9cbd26df8825771c87.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/05c83014e5d63cd087c378a62151d0c4.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/df25628a7fcddff649a7ee808d12f172.jpg" /> <br /> <img style="width:705px;height:466px;" border="0" alt="" src="https://simg.open-open.com/show/76605373d15a9574004013f859f86874.jpg" /> <br /> <img title="rar.png" src="https://simg.open-open.com/show/42a8c3e06b0df6f814686984be88c6b4.png" /> <a title="authority.rar" href="/misc/goto?guid=4959500713617983141">authority.rar</a> <br /> <br /> 转自: <a href="/misc/goto?guid=4959500713696756259" target="_blank">http://www.iteye.com/topic/1119744</a> <br />