多对一关联关系是Hibernate中很重要的一种关联关系。下面我们举例说明Hibernate中多对一的关联关系。

ER图

ER图
部门表有两个字段,id和部门名称name,id是主键;
员工表的主键是id,name指的是员工姓名,department_id是外键。
员工和部门就是多对一的关联关系。

阅读更多

struts2提供了功能强大的输入校验机制,通过struts2内建的输入校验器,可完成大部分的校验功能,并可以同时完成客户端和服务器端的校验。如果应用的输入校验规则特别,struts2也允许通过重写validate方法来完成自定义校验。

输入校验的流程

  1. 类型转换器对输入参数进行类型转换,并把转换后的值赋给action中的属性。
  2. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器会将异常信息添加到fieldErrors里,不管是否出现异常,都会进入第三步。
  3. 系统通过反射技术先调用action中的validateXxx()方法,
  4. 然后在调用validate()方法。
  5. 最后,如果系统的fieldErrors中存在错误信息(*即存放错误信息的集合的size大于0),系统会将请求回发到input视图中,如果没有错误信息,系统会执行action中的处理方法。

    阅读更多

通过例子可以很好理解struts2中的自定义拦截器,如果用户登录成功可以访问action中的所有方法,如果用户没有登录则不可以访问action中的方法,并且提示“没有权限执行该操作”。
本例子重点说明自定义拦截器的使用方法,对于登录等界面不做过多的代码编写。
user.jsp,用来实现用户登录功能,代码如下:

1
2
3
4
5
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
request,getSession().setAttribute("user","zju");
%>
用户已经登录

阅读更多

在struts开发中,有时会遇到这样的情况:

如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一种类型转换器供我们使用。
我们用如下代码定义类型转换器,用来实现字符串格式(“20150601”)和日期格式之间的双向转换,自定类型转换器要继承DefaultTypeConverter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TypeConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Map<String, Object> context, Object value,Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
try{
if(toType==Date.class){
String[] params = (String[]) value;
return dateFormat.parse(params[0]);
}
else if(toType==String.class){
Date date = (Date)value;
return dateFormat.format(date);
}
}
catch (Exception e) {}
return null;
}
}

配置局部类型转化器

阅读更多

Action是struts2的核心内容,接下来我们将学习一下struts2中的Action。

Action配置中的各项默认值

1
2
3
<action name="helloworld">
<result>/WEB-INF/page/hello.jsp</result>
</action>

class的默认值是ActionSupport,method的默认值是execute、result中name的默认值是success。
在这种配置情况下,当浏览器请求helloworld(action)时,可以直接请求转发到hello.jsp界面。

result的几种转发类型

阅读更多

struts2

Struts2是在WebWork2基础上发展而来,属于MVC框架。优点:

  1. 提供了拦截器,可以进行AOP编程;
  2. 提供了类型转换器,可以把特殊的请求参数转换成需要的类型;
  3. struts2的应用可以不依赖于 ServletAPI和strutsAPI,无侵入式设计;
  4. 提供支持多种表现层技术,如JSP等等
  5. struts2的输入校验可以对指定方法进行校验
  6. 提供全局范围、包范围和Action范围的国际化资源文件管理实现。

    搭建struts2开发环境

    阅读更多

常用术语

学习AOP之前,先了解AOP中常用术语

  1. 切面(Aspect)
    切面是一个关注点的模块化,如事务管理就是一个在JavaEE企业中应用最常见的界面。在企业应用编程中,首先需要通过分析,抽取出通用的功能,即“切面”。
    事务、日志、安全性的框架、权限都是切面
  2. 连接点(Joinpoint)
    连接点是执行程序过程中的特定的点。Spring框架只支持方法作为连接点,如方法调用之前、方法调用后、或者发生异常时等。
  3. 通知(Advice)
    通知就是切面的具体实现。通知将在切面的某个特定的连接点上执行动作,Spring中执行的动作往往就是调用某一个类的具体方法。例如:在保存订单的模块中,进行日志管理(一个切面),具体是在保存订单的方法执行之前(连接点)执行写日志(通知)的功能。其中,日志管理是很多模块中通用的功能,因此这就是一个切面,而具体是在保存订单之前执行日志保存,那么保存订单前这个点就是连接点,实现日志保存功能的类就是通知。
    就是切面中的方法。
  4. 切入点(Pointcut)
    切入点是连接点的集合,通知将在满足一个切入点表达式的所有连接点上运行。
    举例:
    在拦截器中,有一系列判断性的内容

    1
    if(method.equals("savePerson")||method.equals("updatePerson") ||method.equals("deletePerson")){ ... }

    满足了上面三个方法才能开启事务,这些判断条件就为切入点

    阅读更多

代理模式

所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式是一种结构性设计模式。当客户端不想直接调用主题对象,而希望主题对象的行为前后加上预处理或者后续处理时,则可以使用代理模式。

代理模式的三种角色

阅读更多