noHup - jeesite
type: channel
link: http://rin.nohup.cc/tag/jeesite/
items: 关于Ehcache
items: 关于日志部分的简单介绍
items: jeesite中hibernate的应用
items: login模块的从头到尾整合
items: 关于代码生成器的使用和解析
items: 框架前端页面涉及到的标签以及数据传输
items: 项目笔记
items: jeesite里spring－mvc的初步认识
items: Jeesite中shiro的用法讲解
items: 在Mac下jeesite框架搭建的相关问题

关于Ehcache
type: item
date: 2015-01-14T03:12:00+00:00
description: Ehcache简介 Ehcache是一个纯Java的进程内缓存框架,是Hibernate中默认的CacheProvider,主要面向通用缓存,Java EE和轻量级容器。主要特性有： 简单快速 多种缓存策略,支持LRU、LFU和FIFO。 支持内存和硬盘作为缓存存储 缓存数据会在虚拟机重启的过程中写入磁盘 具有缓存和缓存管理器的侦听接口 可以通过RMI、可插入API等方式进行分布式缓存 可与spring、Hibernate、shiro等框架组件进行整合 项目中Ehcache的配置 Jeesite中Ehcache的配置文件主要在资源目录下的cache文件夹中，默认使用的是ehcache-local.xml和ehcahce-hibernate-xml，前者是ehcache的配置文件，后者是针对hibernate的配置文件。下面先看一下ehcache-local.xml的内容： <ehcache updateCheck="false" name="defaultCache"> <diskStore path="java.io.tmpdir/jeesite/ehcache/default" /> <defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" maxEntriesLocalDisk="100000" /> <cache name="sysCache" maxElementsInMemory="100" eternal="true" overflowToDisk="true"/> <cache name="cmsCache" maxElementsInMemory="100" eternal="true" overflowToDisk="true"/> <cache name="shiro-activeSessionCache" maxElementsInMemory="100" overflowToDisk="true" eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0" diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/> <cache name="org.apache.shiro.realm.text.PropertiesRealm-0-accounts" maxElementsInMemory="100" eternal="true" overflowToDisk="true"/> <cache name="SimplePageCachingFilter" maxElementsInMemory="100" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LFU"/> </ehcache> 其中，syscache和cmscache分别是针对系统管理模块和内容管理模块的缓存。SimplePageCachingFilter是页面缓存。各缓存项的含义如下： diskStore path: 缓存保存到磁盘的位置 maxElementsInMemory：缓存中允许创建的最大对象数 eternal：缓存中对象是否为永久的，如果是，超时设置将被忽略，对象从不过期。 timeToIdleSeconds：缓存数据的钝化时间，也就是在一个元素消亡之前，两次访问时间的最大时间间隔值，这只能在元素不是永久驻留时有效。 timeToLiveSeconds：缓存数据的生存时间，也就是一个元素从构建到消亡的最大时间间隔值，这只能在元素不是永久驻留时有效。 overflowToDisk：内存不足时，是否启用磁盘缓存。 而ehcahce-hibernate-xml则是针对sys模块中的实体类通过hibernate来缓存，包括User、Role、Menu、Office、Area、Dict以及userList、MenuList、roleList等实体类。下面列举几个配置，其他的以此类推： <cache name="com.thinkgem.jeesite.modules.sys.entity.Area" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="true" maxEntriesLoca…

关于日志部分的简单介绍
type: item
date: 2015-01-10T07:23:00+00:00
description: Java日志体系概览 关于Java的日志API可以概括为日志记录的封装API和日志记录实现两类。前一种的典型代表是Apache Commons Logging和SLF4J，后一种的典型代表有JDK自带的日志实现（java.util.logging 包，JUL）以及著名的Log4j。日志封装API是为日志使用者提供了一种统一的接口，使用者可以根据需求来切换具体日志实现方案。 Java日志API 一般来说，日志API一般包括： 记录器（Logger）：日志 API 的使用者通过记录器来发出日志记录请求，并提供日志的内容。在记录日志时，需要指定日志的严重性级别。 格式化器（Formatter）：对记录器所记录的文本进行格式化，并添加额外的元数据。 处理器（Handler）：把经过格式化之后的日志记录输出到不同的地方。常见的日志输出目标包括控制台、文件和数据库等。 Java日志封装API 在这主要介绍一下目前使用较多的SLF4J日志库，SLF4J 库中核心的 API 是提供工厂方法的 org.slf4j.LoggerFactory 类和记录日志的 org.slf4j.Logger 接口。通过 LoggerFactory 类的 getLogger 方法来获取日志记录器对象。Logger 接口中的方法也是按照不同的严重性级别来进行分组的。 参考：Java日志最佳实践 Jeesite中Log4j的使用分析 Jeesite中使用了Log4j日志记录作为实现，下面依次分析一下Log4j的配置文件和封装了Log4j的Manager类。 Log4j的配置 Log4j支持使用Java properties和xml作为配置文件。相对于xml的格式，Java properties更易读。下面以Jeesite中的log4j.properties为例，所有配置项均以log4j开头，主要配置项为rootlogger,输出终端，输出布局模式。 log4j.rootLogger=WARN, Console, RollingFile Logger是日志记录器，而rootLogger则是所有Logger的祖先，可以通过Logger.getRootLogger()来获取。 #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #RollingFile log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.RollingFile.File=../logs/jeesite.log log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n Log4j的输出终端，由Appender接口定义。其有多种实现，不同实现就对应则不同的日志输出保存方式。例如： ConsoleAppender(控制台) FileAppender(文件) DailyRollingFileAppender(每天都产生一个日志文件) RollingFileAppender(文件大小达到指定尺寸时产生一个新的日志文件，文件名称上会自动添加数字序号。) WriterAppender(将日志信息以流的格式发送到任意指定的地方) 而所有子类Logger均将继承父类Logger的Appender配置。 至于输出布局模式——由Layout接口定义——也有多种实现： PatternLayout（可以灵活地指定布局模式） HTMLLayout（以HTML表格形式布局） SimpleLayout（包含日志信息的级别和信息字符串） TTCCLayout（包含日志产生的时间、线程、类别等信息） ConversionPattern使用的是类似于C语言中printf的格式化输出参数： %c：输出所属的类目，通常就是所在类的全名。 %d：输出日志时间点的日期或时间，默认格式为ISO8601，推荐使用“%d{ABSOLUTE}” %t：输出产生该日志线程的线程名。 %p：输出优先级。 %m：输出代码中指定的消息。 %n：输出一个回车换行符。Windows平台为“\r\n…

jeesite中hibernate的应用
type: item
date: 2015-01-10T03:07:00+00:00
description: 1.综述 总的来说，jeesite中hibernate的应用主要有2个方面，annotation和查询语句。前者主要是指定实体类与数据库表的各种关系，而后者则包括criteria，它以面向对象对方式来实现各种查询逻辑，以及HQL语句，hibernate自定的查询语句。 2.annotation 先说annotation，就拿User来举例，首先对与User类，有如下的实现： @Entity @Table(name = "sys_user") @DynamicInsert @DynamicUpdate @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User extends IdEntity<User> { ... ｝ @Entity用来告诉系统，这个类是一个实体类，提醒系统将它们跟普通POJO类分开。 @Table指定该实体类所对应的数据库表名 @DynamicInsert和@DynamicUpdate两个注释主要目的是提升操作数据的效率。@DynamicUpdate说明在更新时只修改有改动的字段，否则数据库会修改该列的所有字段。@DynamicInsert则针对插入时。 @Cache指定一个数据库表的缓存，也是效率相关。 以上这部分是针对实体类本身的，比较简单，而且直接拓下来完全没问题。 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer sys_id; 这句话在user类里没有用到，可是也特别常用。 @Id功能是指定主键。表示这个数据库表的主键是sys_id； @GeneratedValue指定主键的生成方式，比如自增和手动等。 顺便一提，针对属性的注释可以选择在属性上或者在属性的get方法上。get方法会在把内容存入数据库这个过程中产生作用，而set方法会在把内容取出数据库这个过程中产生作用。 @ManyToOne @JoinColumn(name="company_id") @NotFound(action = NotFoundAction.IGNORE) @JsonIgnore @NotNull(message="归属公司不能为空") @ExcelField(title="归属公司", align=2, sort=20) public Office getCompany() { return company; } 现在开始在难一点的annotation上，主要是在对@ManyToOne，@OneToMany以及@ManyToMany的理解上。 上述代码是User类的getCompany函数及其注释。对与User来说，一个User对应一个Company，而一个Company对应多个User。所以User和Company是多对一的关系。在数据库表中，这种关系的实现形式是在多的那方加入一的那方的外键。 例如User(id,company_id,...),Company(id,...)这种形式。 @ManyToOne就是告诉系统实体属性在数据库表里是以这种形式来组织的。 @JoinColum则是指定这个外键字段在数据库表里的名称。 @NotFound顾名思义，在找不到引用外键多时候采取什么行为，默认是抛出异常，这里采取的是忽略，意思就是允许User没有对应的Company。 @JsonIgnore标明该属性不会在Json进行序列化的时候包含在内。但是我还没有弄懂为什么User类会需要转换为Json。 @NotNull看名字大家都懂的。 @ExcelField自定义的注释，导出excel用的。 这样处理之后，当需要将User中的company存入数据库时，hibernate就会将company所属的另一个实体类office的属性存入office类所对应的数据库表中，并且与User表进行外键关联。 接下来跳过OneToMany，咱们直接来看ManyToMany： @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "sys_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) @Where(clause="del_flag='"+DEL_FLAG_NORMAL+"'") @OrderBy("id") @Fetch(FetchMode.SUBSELECT) @NotFound(action = NotFoundAction.I…

login模块的从头到尾整合
type: item
date: 2015-01-08T03:52:00+00:00
description: 1.sysLogin.jsp 本文采用从前端到后台的形式，整体的阐述一下jeesite中login模块的交互流程，整个jeesite的重要功能我拟将他分为login，list，权限三个部分，应该包括了我们需要实现的大部分功能，计划将这三个部分逐一写出。 jsp这部分我并不太熟，详见嘉炜的jsp讲解，我这里只挑出重要部分介绍： 整个jsp页面其实就是一个表单，它的主要目的就是接受用户输入的用户名和密码字段，然后交给后台处理。action变量指定了该表达的提交方式，既是交由/a/login所对应的函数来处理。 以上就是表单里的两个属性，一个属性名为username，一个名为password，表单会借由request属性传到函数当中，届时就能通过getUsername和getPassword两个函数从request中取出。这部分是在FormAuthenticationFilter中的createToken函数中实现，下文中会详细介绍。 Login模块中的jsp非常简单，难点主要在于shiro的应用上，这也是该模块与普通list模块的区别之处。 2.shiro 之前已经写过一篇shiro相关的文章，只是之前的shiro文章是作为简单的shiro教程来写的，内容大而全，所以知识点之间的串联难免会差一些，这次只做为jeesite应用来写，更注重在逻辑方面，若有问题可以参考前一篇文章。 其实这里也设计到一些spring－mvc的内容，不过之前也已经写过了，而且也很简单，就不作为单独的一章了。 上回合说到，jsp将username和password打包扔给后台，那么后台是由什么接受呢？在spring－mvc中，负责接受前台数据的是controller部分，而form中所指定的action是/a/login。 @RequestMapping(value = "${adminPath}/login", method = RequestMethod.GET) public String login(HttpServletRequest request, HttpServletResponse response, Model model) { User user = UserUtils.getUser(); // 如果已经登录，则跳转到管理首页 if(user.getId() != null){ return "redirect:"+Global.getAdminPath(); } return "modules/sys/sysLogin"; } @RequestMapping(value = "${adminPath}/login", method = RequestMethod.POST) public String login(@RequestParam(FormAuthenticationFilter.DEFAULT_USERNAME_PARAM) String username, HttpServletRequest request, HttpServletResponse response, Model model) { User user = UserUtils.getUser(); // 如果已经登录，则跳转到管理首页 if(user.getId() != null){ return "redirect:"+Global.getAdminPath(); } model.addAttribute(FormAuthenticationFilter.DEFAULT_USERNAME_PARAM, username); model.addAttribute("isValidateCodeLogin", isValidateCodeLogin(username, true, false)); return "modules/sys/sysLogin"; } 很容易就能定位到，以上两个函数就是处理form的函数，或者说正常情况下是由这两个函数来处理。但是仔细看这两个函数，并没有进行逻辑处理，只是简单的检查和跳转。这是因为shiro的登陆功能在controller之前加入了一个filter。这个filter被配置在文件spring-context-shiro.xml文件里。 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="${adminPath}/log…

关于代码生成器的使用和解析
type: item
date: 2015-01-07T03:03:00+00:00
description: 代码生成器的使用 正如许多J2EE整合开发框架一样，Jeesite也提供了代码生成器，我们可以通过配置，利用它来生成一个独立模块的各层次的基础部分，其中包括： Entity,即实体类。对应MVC的Model部分。其继承了Common模块中的模板类BaseEntity。 DAO层，封装了对实体类的CRUD操作，相应地继承了模板类BaseDAO。 Service层，封装底层，并加了一些基础功能，作为服务层。 Controller层，对应MVC的C部分。相应继承了抽象类BaseController。 JSP,对应MVC的View部分。代码生成器会生成xxxList和xxxForm两个JSP页面，分别用以展示和增删改查数据条目。此处的XXX为类名。 代码生成器的使用非常简单，首先找到com.thinkgem.jeesite.generate包下的generate类。首先根据注释，自行定义新模块的包名、模块名、类名、功能名、类作者名的对应变量。其中： 包名.模块名.是生成的新模块各个层次的包，默认会生成entity、dao、service、web四个包。而WEB-INF/views/modules/下会生成一个模块名的文件夹。该文件夹为上面提到的两个JSP页面。 类名就对应四个包下类名前缀，若类名为Sign，则四个包下的四个类分别为Sign、SignDAO、SignService、SignController。 功能名是为了说明功能模块的作用，会在生成的JSP中包含对应信息。而类作者名则会加到生成类的注释中。 配置好这些后，对generate类选择RUN AS - Java Application即可。由于该类包含Main()方法，是可执行的。然后它会读取com.thinkgem.jeesite.generate.template下的6个ftl文件——这是freemaker模板引擎使用的文件——最后填入对应的配置变量，生成如前所述的4个类和2个JSP页面。 最后要运行这个生成模块的话，还需手动在数据库中建立对应的数据表，数据表除了在实体类中定义的属性外，还必须包含del_flag、remarks、create_by、create_date、update_by、update_date这几个字段。这是因为实体类要继承DataEntity这个抽象类，此类中定义了这些属性，后续的查询、排序中要用到这些字段。 代码生成器各部分解析 代码生成器实际为我们生成了MVC的各个层次，下面结合代码，分析一下各部分的原理。 Entity实体层 首先，任何Entity都是继承了IdEntity这个抽象类，IdEntity主要提供实体类的id属性及其对应setter和getter方法。这样生成的entity就继承了这个属性。关于com.thinkgem.jeesite.common.persistence包下几个基础Entity类的关系可以表示如下：IdEntity--->DataEntity--->BaseEntity。这样每个生成的Entity就继承了包括id、del_flag、remarks、create_by、create_date、update_by、update_date在内的属性。其中id是利用util中的IdGens生成的uuid，即生成的id不会自增。而是一段字母+数字的唯一组合。若对id有auto_increment的要求，则需要考虑重写IdEntity类。 Dao层 实际上，所有代码生成的dao都是直接继承了common中的BaseDao类，继承后的子类并未添加任何属性和方法。在此就主要针对BaseDao类分析。总的来说，BaseDao主要是在Hibernate提供的数据库操作基础上，封装了Page、parameter参数。这里的Page是作为展示页面的对象，而Parameter是继承了HashMap<String, object>的哈希字典。BaseDao就针对实体对象，提供了find、get、save、update等几类操作，每种操作根据参数的不同有几种函数重载形式。而对删除操作，这里是通过deleteById来设置del_flag字段的布尔值进行逻辑删除的。如果要进行真实的表中某行数据删除，需要我们自己写对应的操作函数。 Service层 新模块的Service层一般都有一个dao对象的属性，然后在dao的基础上进一步封装，加入一些其它有用功能的服务。由于不同模块提供的服务不尽相同，这里就不好进行概括了。而BaseService类则是提供了根据用户角色的DATA_SCOPE进行数据过滤。 Controller层 新建模块的Controller主要使用Spring提供的Annotation，把访问Url与实际的Jsp页面映射起来，与此同…

框架前端页面涉及到的标签以及数据传输
type: item
date: 2015-01-06T02:59:00+00:00
description: Overview 本文针对以JSP为主的前端界面，如何展示数据以及接收后台传输的数据做出了一点说明。 目前框架前端页面所使用到的标签，主要为三种：普通的JSP标签，JSP标准标签库(JSTL)，标签库描述符。下面分别介绍这三种不同的形式，并以框架中的src/main/webapp/WEB-INF/views/modules/sys文件夹中的后台管理主页面sysIndex.jsp为例进行分析。 JSP标签 普通的JSP标签几乎是在HTML标签之外，添加了一些传输数据和控制显示的功能，在此不再做过多的解释。请参考以下网址详细了解：http://www.w3cschool.cc/jsp JSP标准标签库(JSTL) JSP标准标签库（JSTL）是一个JSP标签集合，它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务，比如迭代，条件判断，XML文档操作，国际化标签，SQL标签。 除了这些，它还提供了一个框架来使用集成JSTL的自定义标签。 JSTL标签按照功能可以分为核心标签，格式化标签，SQL 标签，XML标签，JSTL函数。 根据我们的需求，这里只介绍一下核心标签，并省略了JSTL库的安装。 核心标签是最常用的JSTL标签。引用核心标签库的语法如下： <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:out> 用于在JSP中显示数据，就像<%= ... > <c:set> 用于保存数据 <c:remove> 用于删除数据 <c:catch> 用来处理产生错误的异常状况，并且将错误信息储存起来 <c:if> 与我们在一般程序中用的if一样 <c:choose> 本身只当做<c:when>和<c:otherwise>的父标签 <c:when> <c:choose>的子标签，用来判断条件是否成立 <c:otherwise> <c:choose>的子标签，接在<c:when>标签后，当<c:when>标签判断为false时被执行 <c:import> 检索一个绝对或相对 URL，然后将其内容暴露给页面 <c:forEach> 基础迭代标签，接受多种集合类型 <c:forTokens> 根据指定的分隔符来分隔内容并迭代输出 <c:param> 用来给包含或重定向的页面传递参数 <c:redirect> 重定向至一个新的URL. <c:url> 使用可选的查询参数来创造一个URL 以<c:forEach>为例，对该标签详细说明： <c:forEach>标签封装了Java中的for，while，do-while循环。它迭代一个集合中的对象。 属性 <c:forEach>标签有如下属性： 属性 | 描述 items 要被循环的信息 begin 开始的元素（0=第一个元素，1=第二个元素） end 最后一个元素（0=第一个元素，1=第二个元素） step 每一次迭代的步长 var 代表当前条目的变量名称 varStatus 代表循环状态的变量名称 该标签主要用来在JSP页面中循环显示一个列表型栏目，比如从后台取到一个用户list数据，使用此标签可以循环将用户list中的每一个用户信息显示在JSP页面。 <c:forEach>实例演示 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> c:forEach 标签实例 <c:forEach var="i" begin="1" end="5"> Item <c:out value="${i}"/> </c:forEach> 结果显示如下： Item 1 Item 2 Item 3 Item 4 Item 5 关于所有这些标签的更详细信息，请参见：http://www.w3cschool.cc/jsp/jsp-jstl.html 标签库描述符 tld是taglib description 的缩写。 标签库描述文件，如要在JSP页面中实现JSP标签，必须首先定义实现标签的类，然后在标签库描述文件（TLD）中将写好的类映射成jsp标签,最后在JSP文件中使用定义好的标签，就可以生成动态的JSP内容。 下面结合sysIndex.jsp完整说明整个流程。 sysIndex.jsp代码片段： <%@ page contentType="text/html;charset=UTF-8" %> <%@ include file="/WEB-INF/views/include/taglib.jsp"%> ... <%@ include file="/WEB-INF/views/include/taglib.jsp"%> 此代码将taglib.j…

项目笔记
type: item
date: 2014-12-31T09:23:00+00:00
description: 一、shiro访问权限 1.如何规定访问权限？ @RequiresPermissions 参数是否只是简单的字符串匹配？（未解决） 2.如何指定对应用户的访问权限？ （1）doGetAuthorizationInfo中有getMenuList()函数，该函数获取当前user所拥有的menu。 1当前user何时指定？ 在doGetAuthenticationInfo中生成Principal(user)。 从此就能通过subject.getPrincipal取出，也能在doGetAuthorizationInfo当参数中。 （2）接着通过addStringPermission添加到subject里 （3）当@RequriesPerminssions时从subject中取出验证 二、cache 1.在UserUtils中 三、page 四、取rolelist和menulist 1.各种hibernate的annotation @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "sys_role_menu", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = { @JoinColumn(name = "menu_id") }) @Where(clause="del_flag='"+DEL_FLAG_NORMAL+"'") @OrderBy("id") @Fetch(FetchMode.SUBSELECT) @NotFound(action = NotFoundAction.IGNORE) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 五、aop 六、多个filter或realm //1不同url对应不同的realm？？ 2定义两个shirofilter 七、log日志 1.LogInterceptor中有简单的日志记录

jeesite里spring－mvc的初步认识
type: item
date: 2014-12-25T13:56:00+00:00
description: 1.整体框架和流程 首先是跟spring－mvc没有直接关系但是是系统整体的流程的说明。 以user管理为例，最外层是UserController结构，这个结构是跟spring－mvc直接关联的，之后会细讲。这个结构的主要是分配url的处理函数。当用户在浏览器中输入url时，spring－mvc把url和表单信息引导到UserController的某个函数中处理，然后返回对应的view表示物。该view有多种返回形式。权限验证都在这一层，能够判断哪些view有权限访问。 controller中有一个SystemService，基本就是传统ssh框架中的service了，负责某一功能的业务逻辑实现。service中还有各种DAO的实体，能够通过DAO访问数据库。除此之外，还有SystemAuthorizingRealm以及IdentityService，前者能在执行处理的过程中管理认证信息，特别是一些缓存信息；后者则跟Activiti，也就是工作流有关，具体细节还待摸索。总而言之，service直接操作数据实体，提供所需的各种业务逻辑实现。这些相关类都通过spring的自动装配导入。Transaction都在这一层。 此外就是User类和UserDAO，hibernate的内容，不用赘述。 2.spring－mvc的annotation 2.1 annotaton @Autowired： @Autowired注解标签可以对成员变量、方法和构造函数进行标注，来完成自动装配的工作。可以写在成员变量之上，也可以在变量对应的set方法上。 public class RoleServicesLogic implements RoleServices { @Autowired private RoleDao roleDao; } 也可以对方法进行注解 public class RoleServicesLogic implements RoleServices { private RoleDao roleDao; @Autowired public void setRoleDao(RoleDao roleDao) { this.roleDao = roleDao; } } 以上两种不同实现方式中，@Autowired的标注位置不同，它们都会在Spring在初始化RoleManagerImpl这个bean时， 自动装配roleDao这个属性，区别是：第一种实现中，Spring会直接将RoleDao类型的唯一一个bean赋值给roleDao这个成员变量； 第二种实现中，Spring会调用setRoleDao方法来将RoleDao类型的唯一一个bean装配到RoleDao这个属性。 2.2 常用spring的anootation @Service用于标注业务层组件 @Repository用于标注数据访问组件，即DAO组件 @Controller用于标注控制层组件，如Struts中的Action或者springmvc的controller @Component泛指组件，当组件不好归类时，可以使用这个注解进行标注 @Entity 实体类注解标签 @Table 实体类对应的数据库实际的表名，不设置表名默认数据库表名与类名一致。 2.3 RequestMapping 1）最基本的，方法级别上应用，例如： @RequestMapping(value="/departments") public String simplePattern(){ System.out.println("simplePattern method was called"); return "someResult"; } 则访问http://localhost/xxxx/departments的时候，会调用 simplePattern方法了 2）参数绑定 @RequestMapping(value="/departments") public String findDepatment( @RequestParam("departmentId") String departmentId){ System.out.println("Find department with ID: " + departmentId); return "someResult"; } 形如这样的访问形式： /departments?departmentId=23就可以触发访问findDepatment方法了 3) REST风格的参数 @RequestMapping(value="/departments/{departmentId}") public String findDepatment(@PathVari…

Jeesite中shiro的用法讲解
type: item
date: 2014-12-25T08:53:00+00:00
description: 前言 Apache Shiro 是一个框架，可用于身份验证和授权。虽然这两个术语代表的是不同的含义，但出于它们在应用程序安全性方面各自的角色考虑，它们有时会被交换使用。 身份验证 指的是验证用户的身份。在验证用户身份时，需要确认用户的身份的确如他们所声称的那样。在大多数应用程序中，身份验证是通过用户名和密码的组合完成的。只要用户选择了他人很难猜到的密码，那么用户名和密码的组合通常就足以确立身份。但是，还有其他的身份验证方式可用，比如指纹、证书和生成键。 一旦身份验证过程成功地建立起身份，授权 就会接管以便进行访问的限制或允许。 所以，有这样的可能性：用户虽然通过了身份验证可以登录到一个系统，但是未经过授权，不准做任何事情。还有一种可能是用户虽然具有了某种程度的授权，却并未经过身份验证。 在为应用程序规划安全性模型时，必须处理好这两个元素以确保系统具有足够的安全性。身份验证是应用程序常见的问题（特别是在只有用户和密码组合的情况下），所以让框架来处理这项工作是一个很好的做法。合理的框架可提供经过测试和维护的优势，让您可以集中精力处理业务问题，而不是解决其解决方案已经实现的问题。 Apache Shiro 提供了一个可用的安全性框架，各种客户机都可将这个框架应用于它们的应用程序。本文中的这些例子旨在介绍 Shiro 并着重展示对用户进行身份验证的基本任务。 本文只针对Jeesite中shiro的用法进行整理，不会包括shiro环境配置和搭建等内容。 Jeesite中的shiro 2.1 spring-context-shiro.xml spring-context-shiro.xml是shiro的主配置文件，配置信息是重点主要是安全认证过滤器的配置。它规定哪些url需要进行哪些方面的认证和过滤 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="p" value="${adminPath}/login" /> <property name="successUrl" value="${adminPath}" /> <property name="filters"> <entry key="authc" value-ref="formAuthenticationFilter"/> </property> <property name="filterChainDefinitions"> <value> /static/** = anon /userfiles/** = anon ${adminPath}/login = authc ${adminPath}/logout = logout ${adminPath}/** = user </value> </property> </bean> shiroFilter是shiro的安全认证过滤器，其中， securityManager：指定一个负责管理的bean，这个新的bean在接下来会定义，其中包含了认证的主要逻辑。 loginUrl：没有登录的用户请求需要登录的页面时自动跳转到登录页面，不是必须的属性，不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。 successUrl：登录成功默认跳转页面，不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面，则在登录自动跳转到那个需要登录的页面。不跳转到此。 unauthorizedUrl：没有权限默认跳转的页面。 map中的entry指定了authc权限所对应的过滤器实体 而属性中的filterChainDefinitions则详细规定啦不同的url的对应权限 anon:例子/admins/**=anon 没有参数，表示可以匿名使用。 authc:例如/admins/user/**=authc表示需要认证(登录)才能使用，没有参数 roles：例子/admins/user/=roles[admin],参数可以写多个，多个时必须加上引号，并且参数之间用逗号分割，当有多个参数时，例如admins/user/=roles["admin,guest"],每个参数通过才算通过，相当于hasAllRoles()方法。 perms：例子/admins/user/**=perms[user:add:],参数可以写多个，多个时必须加上引号，并且参数之间用逗号分割，例如/admins/user/=perms["user:add:,user:modify:*"]，当有多个参数…

在Mac下jeesite框架搭建的相关问题
type: item
date: 2014-12-21T07:52:00+00:00
description: 2.1.4 运行bin\eclipse.bat脚本： 直接在jeesite根目录运行以下命令： mvn -Declipse.workspace=. eclipse:clean eclipse:eclipse 2.3.3 根据修改参数创建对应数据库（数据库编码：UTF-8)。 在mysql中自己手动创建jeesite，使用命令行： create database jeesite; 5. 运行db\init-db.bat脚本，即可导入表结构及演示数据。 直接在jeesite根目录下运行以下命令： mvn antrun:run -Pinit-db 关于tomcat的两个问题： 由于这个项目还算比较大，导致tomcat内存很快被耗完，就会产生内存崩溃，服务器失去响应，解决方案如下：eclipse配置选项,打开选项,输入tomcat,然后点开Server下面的JDK就会出现配置区域. 直接加入: -Xms2048m -Xmx2048m 参考网址：http://www.haogongju.net/art/1910909 在eclipse中启动tomcat，在浏览器中输入localhost:8080找不到页面，解决方案如下： a).双击tomcat服务器，会弹出如下界面，如果tomcat上已经部署了项目，第一个红框是灰色的不能改变的，需要右击tomcat，选择Add and Remove，remove掉tomcat上所有的项目，如果依然不能选择，则右击tomcat，Clean，之后就可以选择。 b).修改两个地方，修改成下面这个样子： 参考网址: http://blog.csdn.net/ji_ju/article/details/8545588 关于在mac下不能mvn install成功地原因： log4j的配置路径需要修改： 在log4j.properties中修改： junit java.lang.IllegalStateException: Failed to load ApplicationContext错误：因为测试基准类的读取文件名不正确， BaseDaoTest extends SpringTransactionalContextTests，SpringTransactionalContextTests类中的读取，由 @ContextConfiguration(locations = {"/applicationContext.xml", "/applicationContext-shiro.xml”}) 修改为： @ContextConfiguration(locations = {"/spring-context.xml", "/spring-context-shiro.xml”}) 原因: 项目中重命名了这两个配置文件，但是在读取时却没有更改。 关于运行maven install时，运行测试的乱码问题： 在pom中添加以下代码： <plugin> <groupId>org.apache.maven.plugins\</groupId> <artifactId>maven-surefire-plugin\</artifactId> <version>2.7.2\</version> <configuration> <forkMode>once\</forkMode> <argLine>-Dfile.encoding=UTF-8\</argLine> </configuration> </plugin>