日期Date和String之间的转换:

  1. 1. 全局转换器(推荐使用)
  2. 1. 创建类实现Converter接口,实现Convert方法
  3. public class StringToDateConvert implements Converter<String, Date> {
  4. @Override
  5. public Date convert(String resource) {
  6. if(resource == null){
  7. throw new RuntimeException("请输入值");
  8. }
  9. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  10. try {
  11. Date parse = df.parse(resource);
  12. return parse;
  13. } catch (ParseException e) {
  14. throw new RuntimeException("数据格式转换异常");
  15. }
  16. }
  17. }
  18. 2. SpringMVC的配置文件中进行配置转换器
  19. <!--配置自定义日期转换器-->
  20. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  21. <property name="converters">
  22. <set>
  23. <bean class="cn.wzlove.utils.StringToDateConvert"/>
  24. </set>
  25. </property>
  26. </bean>
  27. <!--开启MVC注解驱动(加载处理器映射器和处理器适配器)-->
  28. <mvc:annotation-driven conversion-service="conversionService">
  29. </mvc:annotation-driven>
  30. 2. 属性转换器
  31. 使用注解进行转换:
  32. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
  33. private Date departureTime;

对于日期在页面的展示(get方法需要注意)

  1. 对于日期在页面上的展示考虑使用字符串,多创建一个String属性,在前台展示的时候使用这个字符串属性,记得转换类型就好.
  2. 实体类:
  3. private Date departureTime;
  4. private String departureTimeStr;
  5. public String getDepartureTimeStr() {
  6. if(departureTime != null){
  7. departureTimeStr = DateFromatUtils.date2String(departureTime,"yyyy-MM-dd HH:mm");
  8. }
  9. return departureTimeStr;
  10. }
  11. DateFromatUtils:
  12. public class DateFromatUtils {
  13. /**
  14. * 日期转时间
  15. * @param date
  16. * @param patt
  17. * @return
  18. */
  19. public static String date2String(Date date, String patt){
  20. SimpleDateFormat sdf = new SimpleDateFormat(patt);
  21. String format = sdf.format(date);
  22. return format;
  23. }
  24. /**
  25. * 字符串转日期
  26. * @param time
  27. * @param patt
  28. * @return
  29. */
  30. public static Date string2Date(String time, String patt){
  31. SimpleDateFormat sdf = new SimpleDateFormat(patt);
  32. try {
  33. Date date = sdf.parse(time);
  34. return date;
  35. } catch (ParseException e) {
  36. e.printStackTrace();
  37. throw new RuntimeException("日期转换异常");
  38. }
  39. }
  40. }

对于特殊的标记属性在页面的展示(get方法需要注意)

  1. 与日期类似,创建额外表示的字段
  2. /**
  3. * 状态 0 关闭 1 开启
  4. */
  5. private Integer productStatus;
  6. /**
  7. * 对状态的字符串描述
  8. */
  9. private String productStatusStr;
  10. public String getProductStatusStr() {
  11. if(null != productStatus){
  12. if(productStatus == 0){
  13. productStatusStr = "关闭";
  14. } else if(productStatus == 1){
  15. productStatusStr = "开启";
  16. }
  17. }
  18. return productStatusStr;
  19. }

Mybatis的一对一和多对多的回顾:

  1. 一对一:
  2. @Select("select * from orders")
  3. @Results({
  4. @Result(id = true,property = "id", column = "ID"),
  5. @Result(property = "orderNum",column = "ORDERNUM"),
  6. @Result(property = "orderTime",column = "ORDERTIME"),
  7. @Result(property = "orderStatus",column = "ORDERSTATUS"),
  8. @Result(property = "peopleCount",column = "PEOPLECOUNT"),
  9. @Result(property = "payType",column = "PAYTYPE"),
  10. @Result(property = "orderDesc",column = "ORDERDESC"),
  11. @Result(property = "product",column = "PRODUCTID",javaType = Product.class,
  12. one = @One(select = "cn.wzlove.mapper.ProductMapper.findProductById"))
  13. })
  14. 多对多:
  15. @Select("select * from orders where id = #{ordersId}")
  16. @Results({
  17. @Result(id = true,property = "id", column = "ID"),
  18. @Result(property = "orderNum",column = "ORDERNUM"),
  19. @Result(property = "orderTime",column = "ORDERTIME"),
  20. @Result(property = "orderStatus",column = "ORDERSTATUS"),
  21. @Result(property = "peopleCount",column = "PEOPLECOUNT"),
  22. @Result(property = "payType",column = "PAYTYPE"),
  23. @Result(property = "orderDesc",column = "ORDERDESC"),
  24. @Result(property = "product",column = "PRODUCTID",javaType = Product.class,
  25. one = @One(select = "cn.wzlove.mapper.ProductMapper.findProductById")),
  26. @Result(property = "member",column = "MEMBERID",javaType = Member.class,
  27. one = @One(select = "cn.wzlove.mapper.MemberMapper.findMemberById")),
  28. @Result(property = "travellers",column = "id",javaType = java.util.List.class,
  29. many = @Many(select = "cn.wzlove.mapper.TravellerMapper.findTravelByOrderId"))
  30. })

PageHelper的使用:

  1. 1. 导入依赖
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version>5.1.2</version>
  6. </dependency>
  7. 2. 进行配置
  8. <!--配置sqlSessionFactory-->
  9. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  10. <property name="dataSource" ref="dataSource"/>
  11. <property name="typeAliasesPackage" value="cn.wzlove.domain"/>
  12. <property name="plugins">
  13. <array>
  14. <bean class="com.github.pagehelper.PageInterceptor">
  15. <property name="properties">
  16. <props>
  17. <prop key="helperDialect">oracle</prop>
  18. <prop key="reasonable">true</prop>
  19. </props>
  20. </property>
  21. </bean>
  22. </array>
  23. </property>
  24. </bean>
  25. 3. 进行使用
  26. @RequestMapping("findAll.do")
  27. public ModelAndView findOrdersAll(@RequestParam(name = "page",required = true,defaultValue = "1") Integer page,
  28. @RequestParam(name = "size",required = true,defaultValue = "4") Integer size){
  29. ModelAndView mv = new ModelAndView();
  30. PageHelper.startPage(page,size);
  31. List<Orders> allOrders = ordersService.findAllOrders();
  32. PageInfo<Orders> pageInfo = new PageInfo<>(allOrders);
  33. mv.addObject("pageInfo",pageInfo);
  34. mv.setViewName("orders-list");
  35. return mv;
  36. }
  37. 4. 对于PageInfo考虑查看源码看看封装的分页信息,列出常用的
  38. //当前页
  39. private int pageNum;
  40. //每页的数量
  41. private int pageSize;
  42. //当前页的数量
  43. private int size;
  44. //由于startRow和endRow不常用,这里说个具体的用法
  45. //可以在页面中"显示startRow到endRow 共size条数据"
  46. //当前页面第一个元素在数据库中的行号
  47. private int startRow;
  48. //当前页面最后一个元素在数据库中的行号
  49. private int endRow;
  50. //总记录数
  51. private long total;
  52. //总页数
  53. private int pages;
  54. //结果集
  55. private List<T> list;
  56. //前一页
  57. private int prePage;
  58. //下一页
  59. private int nextPage;

权限的管理(Srping security的使用)

  1. 1. Srping security的使用: 安全框架(认证和授权)
  2. 1. 导入依赖
  3. spring-security-web
  4. spring-security-config
  5. 2. web.xml配置过滤器
  6. ContextLoaderListener----------> 加载spring-Security.xml的配置文件
  7. DelegatingFilterProxt----------> 委托过滤器代理类-----> springSecurityFilterChain(名字不能变)
  8. 3. spring-security核心配置文件的配置
  9. 1. 哪些资源不登录也能访问,也就是过滤
  10. <security:http pattern="" security="none" >
  11. 2. 认证管理器
  12. <security:authentication-manager>
  13. 3. 配置拦截规则
  14. <security:http auto-config="true" use-expressions="false">
  15. 代码如下:
  16. 2. web.xml的配置:
  17. <filter>
  18. <filter-name>springSecurityFilterChain</filter-name>
  19. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  20. </filter>
  21. <filter-mapping>
  22. <filter-name>springSecurityFilterChain</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping>
  25. <context-param>
  26. <param-name>contextConfigLocation</param-name>
  27. <!--
  28. classpath和classpath*的区别
  29. 前者表示当前工程的类路径下加载配置文件
  30. 后者表示从当前工程的类路径及jar包的类路径下加载
  31. -->
  32. <param-value>
  33. classpath*:applicationContext.xml,
  34. classpath*:spring-security.xml
  35. </param-value>
  36. </context-param>
  37. 3. spring-security.xml的配置:
  38. <?xml version="1.0" encoding="UTF-8"?>
  39. <beans xmlns="http://www.springframework.org/schema/beans"
  40. xmlns:security="http://www.springframework.org/schema/security"
  41. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  42. xsi:schemaLocation="http://www.springframework.org/schema/beans
  43. http://www.springframework.org/schema/beans/spring-beans.xsd
  44. http://www.springframework.org/schema/security
  45. http://www.springframework.org/schema/security/spring-security.xsd">
  46. <!-- 配置不拦截的资源 -->
  47. <security:http pattern="/login.jsp" security="none"/>
  48. <security:http pattern="/failer.jsp" security="none"/>
  49. <security:http pattern="/css/**" security="none"/>
  50. <security:http pattern="/img/**" security="none"/>
  51. <security:http pattern="/plugins/**" security="none"/>
  52. <!--
  53. 配置具体的规则
  54. auto-config="true" 不用自己编写登录的页面,框架提供默认登录页面
  55. use-expressions="false" 是否使用SPEL表达式(没学习过)
  56. -->
  57. <!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
  58. <security:http auto-config="true" use-expressions="false">
  59. <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
  60. <!-- 定义跳转的具体的页面 -->
  61. <security:form-login
  62. login-page="/login.jsp"
  63. login-processing-url="/login"
  64. default-target-url="/index.jsp"
  65. authentication-failure-url="/failer.jsp"
  66. authentication-success-forward-url="/pages/main.jsp"
  67. />
  68. <!-- 关闭跨域请求 -->
  69. <security:csrf disabled="true"/>
  70. <!-- 退出 -->
  71. <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp" />
  72. </security:http>
  73. <!-- 切换成数据库中的用户名和密码 -->
  74. <security:authentication-manager>
  75. <security:authentication-provider user-service-ref="userService">
  76. <!-- 配置加密的方式(开始的时候由于密码没有加密,所以将这个应该先注释掉,等到密码加密了再放开) -->
  77. <security:password-encoder ref="passwordEncoder"/>
  78. </security:authentication-provider>
  79. </security:authentication-manager>
  80. <!-- 配置加密类 -->
  81. <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
  82. <!-- 提供了入门的方式,在内存中存入用户名和密码
  83. <security:authentication-manager>
  84. <security:authentication-provider>
  85. <security:user-service>
  86. <security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>
  87. </security:user-service>
  88. </security:authentication-provider>
  89. </security:authentication-manager>
  90. -->
  91. <!--如果密码没有加密,则密码前需要添加{noop}-->
  92. </beans>

Spring Security的权限控制

服务器的权限控制
  1. 1. JSR250注解配置
  2. 1. pom.xml中引入依赖
  3. <dependency>
  4. <groupId>javax.annotation</groupId>
  5. <artifactId>jsr250-api</artifactId>
  6. <version>1.0</version>
  7. </dependency>
  8. 2. spring-security.xml的配置文件中开启注解开关
  9. <security:global-method-security jsr250-annotations="enabled"></security:global-method-security>
  10. 3. 在方法上使用注解(一般在Controller注解上)
  11. @RolesAllowed({"ADMIN","USER"}) ====> 必须有ADMIN或者USER角色才可以访问此方法
  12. @PermitAll ====> 允许所有的角色都可以访问
  13. @DenyAll ====> 所有的角色都不可以访问
  14. 2. 使用@Secured注解
  15. 1. spring-security.xml的配置文件中开启注解开关
  16. <security:global-method-security secured-annotations="enabled"></security:global-method-security>
  17. 2. 使用注解
  18. @Secured("ROLE_ADMIN") ====> 拥有ADMIN角色的用户可以访问,必须要有ROLE_
  19. 3. 基于表达式的
  20. 1. 在配置文件中开启注解开关
  21. <security:global-method-security pre-post-annotations="enabled" ></security:global-method-security>
  22. 2. @PreAuthorize("hasRole('ROLE_ADMIN')") ====> 如果表达式返回true,可以访问该方法,由于使用了spel表达式,所以配置文件需要更改(在原来的基础上,修改use-expressionsaccess):
  23. <security:http auto-config="true" use-expressions="true">
  24. <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
  25. @PreAuthorize("authentication.principal.username == 'wzlove'")表示只有wzlove用户可以访问
前端的权限控制
  1. 1. pom.xml中引入依赖
  2. <dependency>
  3. <groupId>org.springframework.security</groupId>
  4. <artifactId>spring-security-taglibs</artifactId>
  5. <version>${spring.security.version}</version>
  6. </dependency>
  7. 2. jsp页面引入标签库:
  8. <%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
  9. 3. 标签的使用:
  10. 1. 获取当前登录的用户名
  11. <security:authentication property="principal.username"/>
  12. 2. 根据权限隐藏标签(拥有ADMIN角色才可以显示该标签)
  13. <security:authorize access="hasRole('ADMIN')">
  14. <li id="system-setting"><a
  15. href="${pageContext.request.contextPath}/user/findAll"> <i
  16. class="fa fa-circle-o"></i> 用户管理
  17. </a></li>
  18. </security:authorize>

SpringAOP的日志记录控制(把数据存放在数据库中)

  1. 1. 创建数据库的表结构:
  2. CREATE TABLE sysLog(
  3. id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,
  4. visitTime timestamp,
  5. username VARCHAR2(50),
  6. ip VARCHAR2(30),
  7. url VARCHAR2(50),
  8. executionTime int,
  9. method VARCHAR2(200)
  10. )
  11. 2. 创建日志实体:
  12. public class SysLog {
  13. /**
  14. * 主键uuid
  15. */
  16. private String id;
  17. /**
  18. * 访问时间
  19. */
  20. private Date visitTime;
  21. /**
  22. * 访问时间前台展示
  23. */
  24. private String visitTimeStr;
  25. /**
  26. * 操作者
  27. */
  28. private String username;
  29. /**
  30. * 操作者ip
  31. */
  32. private String ip;
  33. /**
  34. * 操作的URL
  35. */
  36. private String url;
  37. /**
  38. * 执行的时长
  39. */
  40. private Long executionTime;
  41. /**
  42. * 访问方法
  43. */
  44. private String method;
  45. settergetter
  46. }
  47. 4. 创建mapper:
  48. @Mapper
  49. public interface SysLogMapper {
  50. @Insert("insert into syslog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})")
  51. void saveSysLog(SysLog sysLog);
  52. @Select("select * from syslog")
  53. List<SysLog> findAll();
  54. }
  55. 5. AOP控制:
  56. @Component
  57. @Aspect
  58. public class LogAop {
  59. @Autowired
  60. private HttpServletRequest request;
  61. @Autowired
  62. private SysLogService sysLogService;
  63. @Around("execution(* cn.wzlove.controller.*.*(..))")
  64. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  65. Object proceed = null;
  66. // 访问方法(分别获取类和方法,然后进行拼接)
  67. String className = pjp.getTarget().getClass().getName();
  68. String methodName = pjp.getSignature().getName();
  69. // 忽略日志本身的Controller
  70. if("cn.wzlove.controller.SysLogController".equals(className)){
  71. // 获取参数
  72. Object[] args = pjp.getArgs();
  73. // 执行原始方法(放行)
  74. proceed = pjp.proceed(args);
  75. } else{
  76. // 封装SysLog,获取SysLog的属性
  77. // 访问时间
  78. Date visitDate = new Date();
  79. // 操作者
  80. String loginName = SecurityContextHolder.getContext().getAuthentication().getName();
  81. // 操作者ip
  82. String remoteAddr = request.getRemoteAddr();
  83. // 操作的URL
  84. String requestURI = request.getRequestURI();
  85. // 执行时长
  86. Long startTime = System.currentTimeMillis();
  87. // 获取参数
  88. Object[] args = pjp.getArgs();
  89. // 执行原始方法(放行)
  90. proceed = pjp.proceed(args);
  91. // 结束时间
  92. Long endTime = System.currentTimeMillis();
  93. Long executeTime = endTime - startTime;
  94. // 封装SysLog
  95. SysLog sysLog = new SysLog();
  96. sysLog.setIp(remoteAddr);
  97. sysLog.setExecutionTime(executeTime);
  98. sysLog.setMethod(className+"."+methodName);
  99. sysLog.setUsername(loginName);
  100. sysLog.setVisitTime(visitDate);
  101. sysLog.setUrl(requestURI);
  102. // 进行插入操作
  103. sysLogService.saveSysLog(sysLog);
  104. }
  105. return proceed;
  106. }
  107. }
  108. 6. 日志的Controller
  109. @Controller
  110. @RequestMapping("sysLog")
  111. public class SysLogController {
  112. @Autowired
  113. private SysLogService sysLogService;
  114. @RequestMapping("findAll")
  115. public ModelAndView findAll(){
  116. ModelAndView mv = new ModelAndView();
  117. List<SysLog> all = sysLogService.findAll();
  118. mv.addObject("sysLogs",all);
  119. mv.setViewName("syslog-list");
  120. return mv;
  121. }
  122. }

SSM 小demo的盲点总结的更多相关文章

  1. SpringMVC小demo解析

    第一次实际接触SpringMVC,之前在教程网站上看得是概念性的. SpringMVC是属于Java框架SSM中的一环 在做了一个小demo后发现原来编程如此简单. 首先建立动态网页项目(Dynami ...

  2. 快速搭建一个SSM框架demo

    我之所以写一个快速搭建的demo,主要想做一些容器的demo,所以为了方便大家,所以一切从简,简单的3层架构 先用mysql的ddl,后期不上oracle的ddl ; -- ------------- ...

  3. 新手 gulp+ seajs 小demo

    首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...

  4. Nancy之基于Nancy.Hosting.Self的小Demo

    继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...

  5. Nancy之基于Nancy.Owin的小Demo

    前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...

  6. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  7. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  8. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  9. Win10 FaceAPI小demo开发问题汇总

    Win10 FaceAPI小demo开发问题汇总 最近使用微软牛津计划做一个小demo,使用FaceAPI做一个小应用,实现刷脸的功能.开发的过程中用到几个问题,具体如下: Stream 与IRand ...

随机推荐

  1. jsp内置对象 转发与重定向的区别

    jsp 内置对象  转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...

  2. Discuz3.3精仿小米风格整站模板制作——1、新建模板方案

    术语说明: 模板——模板是一堆按照规定命名方式的html文件,用于指定整个论坛不同页面的外观. 标签——标签和模板共同作用以实现论坛换肤功能,其中标签主要控制页面显示什么数据,显示多少条等. 风格—— ...

  3. Git----02本地仓库进行文件添加&修改&删除&查看

    一.将新文件上传到本地仓库----使用小乌龟工具 1.1.将文件添加到暂存区 进入仓库目录,创建文件,添加暂存区     1.2.将文件添加到本地仓库 选中已经添加到暂存区的文件,进行提交 二.查看本 ...

  4. check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc

    往一个新建的MySQL表中插入数据报错 2018-08-22 14:09:18.875 ERROR 9256 --- [apr-8080-exec-9] o.s.b.w.servlet.support ...

  5. Notes of Daily Scrum Meeting(11.19)

    Notes of Daily Scrum Meeting(11.19) 现在工程项目进入尾声了,我们的项目中还有一些问题需要解决,调试修改起来进度比较慢,所以昨天就没有贴出项目 进度,今天的团队工作总 ...

  6. Oracle 的四种连接-左外连接、右外连接、内连接、全连接

      今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以 ...

  7. beta冲刺(7/7)

    目录 组员情况 组员1:胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:何宇恒 组员11:刘一好 展示组内最新 ...

  8. 【动态规划】POJ-3176

    一.题目 Description The cows don't use actual bowling balls when they go bowling. They each take a numb ...

  9. 【CSAPP笔记】9. 汇编语言——缓冲区溢出

    x86-64 Linux 内存结构 先来看看一个程序在内存中是如何组织的.Linux 为每个进程维持了一段单独的虚拟地址空间.(进程是计算机科学中很深刻.很成功的一个概念.当我们在运行一个程序时,会得 ...

  10. wait 和 sleep 区别

    /* wait 和 sleep 区别? 1,wait可以指定时间也可以不指定. sleep必须指定时间. 2,在同步中时,对cpu的执行权和锁的处理不同. wait:释放执行权,释放锁. sleep: ...