没有比人更高的山

JSP中获取表单中多选列表(Multiple Select)提交的值0

在select标签中添加multiple=”multiple”属性,可以使下拉列表(drop down list)变成多选列表(multiple select list),但是在jsp与servlet中使用获取表单值常用的request.getParameter(”value”)获取到的只是多选列表中的第一个选中值,经过查询资料,原来HttpServletRequest还有一个方法getParameterValues(String key),其返回值为String类型的数组,里面存放的正是多选列表中的选中的值。

也就是说,jsp和servlet中对于表单中的多选控件提交的值都是通过此getParameterValues方法来获取的,比如checkbox list(复选框列表)等,示例代码如下:
<form action=”index.jsp” method=”POST”>
    <select name=”value” multiple=”multiple”>
        <option value=”val1″>Value 1</option>
        <option value=”val2″>Value 2</option>
        <option value=”val3″>Value 3</option>
        <option value=”val4″>Value 4</option>
        <option value=”val5″>Value 5</option>
     </select>
     <input type=”submit” value=”Submit”>
</form>

<%
out.write(”<h3>selected values : <h3>”);
String[] selected = request.getParameterValues(”value”);
if(selected != null){
    for(int i=0; i<selected.length; i++){
        out.write(”<p>” + selected[i] + “<p>”);
    }
}else{
    out.write(”<p> No value selected <p>”);
}
%>

VN:F [1.7.5_995]
Rating: 7.0/10 (4 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

和国务委员刘延东、李鸿忠省长、周济老校长的合影2

20号上午,华中科技大学Dian团队作为我校学生创新能力培养的典型到光电国家实验室接受了国务委员刘延东的视察。我作为团队的一员自然是沾了不少光,还和周济老校长“勾肩搭背”了一把,可惜没有照片留下来。

刘延东国务委员和Dian团队师生合影
站在刘延东国务委员正后方的就是我啦。

刘延东、李鸿忠、周济、李培根与点团队师生合影
这次站到李鸿忠省长后面了。

VN:F [1.7.5_995]
Rating: 10.0/10 (2 votes cast)
VN:F [1.7.5_995]
Rating: +1 (from 1 vote)

JSF异常消息机制及应用0

JSF有两种异常消息:

[1] JSF提供的标准异常信息,如标准的验证器和转换器生成的异常信息等

[2] 自定义的异常信息

与消息相关的类是javax.faces.application.FacesMessage,他封装了单一的、本地化的、人类可以理解的消息,除了消息字符串本身外,FacesMessage还有三个属性:severity(严重性),summary(摘要),detail(详细信息)

serverity被定义成FacesMessage的内部类,有四种类型:Info、Warn、Error、Fatal
FacesContext负责维护FacesMessage的两个逻辑集合,一个和组件相关的消息集合、一个不与组件相关的消息集合,定义了如下的和消息相关的方法
public Iterator<FacesMessage> getMessages();
public Iterator<FacesMessage> getMessages(String clientId);
public Iterator<String> getClientIdsWithMessages();//返回有消息绑定的组件id
public void addMessage(String clientId, javax.faces.application.FacesMessage message);//向FacesContext中加入一条FacesMessage
public FacesMessage.Severity getMaximumSeverity();//返回最严重的问题的严重性

FacesMessage的部分源代码如下:


private FacesMessage.Severity _severity;
private String _summary;
private String _detail;

public FacesMessage()
{
    _severity = SEVERITY_INFO;
}

public FacesMessage(String summary)
{
    _summary = summary;
    _severity = SEVERITY_INFO;
}

public FacesMessage(String summary, String detail)
{
    _summary = summary;
    _detail = detail;
    _severity = SEVERITY_INFO;
}

public FacesMessage(FacesMessage.Severity severity, String summary, String detail)
{
    if(severity == null) throw new NullPointerException("severity");
    _severity = severity;
    _summary = summary;
    _detail = detail;
}

和消息相关的两个标签是<h:message>与<h:messages>:
<h:message> 有一个必设属性for,标示消息的绑定组件id;showDetail属性默认为false,showSummary属性默认为true
<h:messages>渲染所有的排队消息,在globalOnly设为true时只渲染哪些没有组件标识符的消息。

我一般会在项目中新建一个MessageUtil类,处理消息,其代码如下:

public class MessageUtil {

    public static void addErrorMessage(FacesContext context, String clientId, String message){
        context.addMessage(clientId, new FacesMessage(message));
    }

    public static void addErrorMessage(FacesContext context, String message) {
        addErrorMessage(context, null, message);
    }

    /**
    * Add a global message, the detail is null and the servity is info by default
    * @param message message summary
    */
    public static void addErrorMessage(String message){
        addErrorMessage(FacesContext.getCurrentInstance(), message);
    }

    /**
    * Binding messages to a ui component
    * @param clientId The ui component id
    * @param message message summary
    */
    public static void addErrorMessage(String clientId, String message){
        addErrorMessage(FacesContext.getCurrentInstance(), clientId, message);
    }
}

如 我们在登录时需要向用户提示“用户名或者密码错误”,可以调用public static void addErrorMessage(String message),然后在页面上使用<h:messages globalOnly=”true”/>来显示这个信息。

VN:F [1.7.5_995]
Rating: 9.0/10 (1 vote cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

scala要点(1)4

注:本文是本人在了解scala过程中的一些要点笔记而已,仅帮助学过的朋友进行一下回忆,也供本人以后快速复习用。

scala有两种变量类型,val与var,val型变量初始化了就不能再改变,var则可以改变

scala可以自动推断变量类型,如val name = “zhlwish” 

scala定义函数:
def add(x: Int, y: Int): Int =
if (x > y) x else y
 
for语句写法:
for(arg <- args)
println(arg)
 
foreach是List类型的一个函数,调用方法args.foreach((arg: String) => println(arg)),看起来是lamda表达式
 
数组只能如下定义:
val names = new Array(3) //默认构造器构造
val namess = Array(3) //工厂方法构造
val namesss = Array(”zhlwish”, “zhlwish”) //工厂方法构造
 
和Java用[]不一样,scala用()取索引
 
和java用<>不一样,scala泛型用[],如val val names = new Array[String](3)
 
scala中任何运算符都是函数,如1 + 2实际上是(1).+(2),Int型对象有个名为+的函数
 
有上知,scala中调用函数其实可以不用(),比如val name = “zhlwish”; println(name.toString),这里println一定要用括号,倒不是因为println函数有参数,而是因为println调用了标准控制台输出数据,他本身不是一个对外无影响的
 
scala中列表的定义方式:val oneTwoThree = List(1, 2, 3), List是类型安全的,即List中只能有一种类型的对象,而且,注意List是不可变的
 
List有个方法叫做:::,可以做列表叠加,返回的是一个全新的List,更常用的是::,作用是将一个新元素组合到已有List的前面,即 0 :: oneTwoThree, 返回(0, 1, 2, 3)
 
和List对应的是Tuple,称为元组,也不可变,但是可以放不同类型的元素进去
 
scala也有Set和Map,而且分别有可变Set与Map和不可变Set与Map
Map这么定义:val name = Map(1->”zhlwish.com”)
 
scala中return是可选的,默认返回函数体中最后一句的返回值
VN:F [1.7.5_995]
Rating: 0.0/10 (0 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

DbUnit中文教程——核心组件0

注:本文基本翻译自DbUnit的文档,翻译不好朋友见谅

本文主要介绍在使用DBUnit编写测试用例的时候会常用的几个接口和类
IDatabaseConnection:接口,DbUnit的数据库连接对象,封装了java.sql.Connection
IDataSet:接口,DbUnit的数据集对象,里面可以放多个数据表
DataBaseOperation:抽象类,数据库操作类
 
IDatabaseConnection有两个子类:
DatabaseConnection:封装了一个普通的JDBC连接
DatabaseDataSourceConnection:封装了一个JDBC数据源连接
 
IDataSet是DbUnit用来存储数据的一种数据结构
FlatXmlDataSet:最普遍使用的数据集,每个XML元素代表数据表中的一行数据,XML元素的名称是表明,属性名是列名
XmlDataSet
StreamingDataSet
DatabaseDataSet
QueryDataSet
DefaultDataSet
CompositeDateSet
FilteredDataSet
XlsDataSet
ReplacementDataSet
 
DatabaseOperation
DatabaseOperation.UPDATE:这个操作将从测试数据源中读取的数据集的内容更新到数据库中,注意这个操作正确执行的前提是测试数据表已经存在,如果不存在这个测试用例将会失败
DatabaseOperation.INSERT:这个操作把从测试数据源中读取的数据集的内容插入到数据库中,注意这个操作正确执行的前提是测试数据表不存在,这个操作将新建数据表。如果测试数据表已经存在这个测试用例将会失败。另外,在执行这个操作的时候要特别注意数据集中数据表的顺序,否则可能会因为违反外键约束而造成测试用例失败
DatabaseOperation.DELETE:这个操作会从数据库中删除数据,注意,这个操作只删除数据集中存在的数据行而不是整个数据表中的数据
DatabaseOperation.DELETE_ALL:这个操作删除数据表中的所有行,注意,这个操作也只影响数据集中声明了的数据表,数据集中没有涉及到的数据表中的数据不会删除
DatabaseOperation.TRUNCATE:这个操作将删除数据集中声明的数据表,如果数据中有些表并没有在预定义的数据集中提到,这个数据表将不会被影响。注意,这个操作是按照相反的顺序执行的
DatabaseOperation.REFRESH:顾名思义,这个操作将把预定义数据集中的数据同步到数据库中,也就是说这个操作将更新数据数中已有的数据、插入数据库中没有的数据。数据库中已有的、但是数据集中没有的行将不会被影响。我们用一个产品数据库的拷贝进行测试的时候可以使用这个操作将预定义数据同步到产品数据库中
DatabaseOperation.CLEAN_INSERT:删除所有的数据表中的数据,然后插入数据集中定义的数据,如果你想保证数据库是受控的,这个你会比较喜欢。
DatabaseOperation.NONE:不执行任何操作
CompositeOperation:将多个操作组合成一个,便以维护和重用
TransactionOperation:在一个事物内执行多个操作
IdentityInsertOperation:在使用MSSQL的时候,插入数据时IDENTITY列我们是没有办法控制的,用这个就可以控制了,只有在使用MSSQL的时候才会用得到
VN:F [1.7.5_995]
Rating: 9.5/10 (4 votes cast)
VN:F [1.7.5_995]
Rating: +3 (from 3 votes)


Switch to our mobile site