Spring: Jsp+Java 相关知识整理 (十三)

1. 在Java中获取 .properties 文件的路径 (src/main/resources 下)

ProjectName

|---src/main/java

|---src/main/resources

  |---test.properties

package xxx.yyy;
public class Utils {
    private String filePath = Utils.class.getClassLoader().getResource("test.properties").getPath();
}

2. 获取 .properties Key所对应的值

public String getPropertyConfig(String key) {
        Resource resource = new ClassPathResource("test.properties");
        Properties props = null;
        try {
            props = PropertiesLoaderUtils.loadProperties(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return props.getProperty(key);
    }

3. 第二种获取 .properties Key 对应值方法

public static String getValueByKey(String key, String filePath) {
        Properties pps = new Properties();
        try {
             InputStream in = new BufferedInputStream (new FileInputStream(filePath));
             pps.load(in);
             String value = pps.getProperty(key);
             System.out.println(key + " = " + value);
             return value;

         }catch (IOException e) {
             e.printStackTrace();
             return null;
         }
    }

4. 写入修改 .properties 健值对方法 [单健]

public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
        Properties pps = new Properties();

        InputStream in = new FileInputStream(filePath);
        //从输入流中读取属性列表(键和元素对)
        pps.load(in);

        OutputStream out = new FileOutputStream(filePath);
        pps.setProperty(pKey, pValue);
        //以适合使用 load 方法加载到 Properties 表中的格式,
        //将此 Properties 表中的属性列表(键和元素对)写入输出流
        pps.store(out, "Update " + pKey + " name");
    }

5. 写入修改 .properties 健值对方法 [从Hashtable 读取写入]

public static void WriteProperties(String filePath, Map<String, String> maps) throws IOException {
        Properties pps = new Properties();

        InputStream in = new FileInputStream(filePath);
        //从输入流中读取属性列表(键和元素对)
        pps.load(in);

        OutputStream out = new FileOutputStream(filePath);

        for (String key : maps.keySet()) {
            pps.setProperty(key, maps.get(key));;
        }

        //以适合使用 load 方法加载到 Properties 表中的格式,
        //将此 Properties 表中的属性列表(键和元素对)写入输出流
        pps.store(out, "Store properties");
    }

6. 将 json String 转化为 java 对象;

有这么个 java Model [标准 POJO];

public class xxModel implements java.io.Serializable {
    private String id;
    private String createName;
    private Date createDate;

    public xxModel() {

    }

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCreateName() {
        return this.createName;
    }

    public void setCreateName(String createName) {
        this.createName = createName;
    }

    public Date getCreateDate() {
        return this.createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}

有这么一串 json 字符串,要转化为 xxModel:

String json = "[{\"id\":\"01\",\"createName\":\"admin\",\"createDate\":\"2014-09-02 14:30\"},{...}]";

@SuppressWarnings("unchecked")
    public static <T> List<T> getJavaCollection(T clazz, String jsons) {
        List<T> objs = null;
        JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON(jsons);
        // TimestampToDateMorpher
        JSONUtils.getMorpherRegistry().registerMorpher(
                new DateMorpher(new String[] { "yyyy-MM-dd",
                        "yyyy-MM-dd‘T‘HH:mm", "yyyy-MM-dd‘T‘HH:mm:ss" }));
        // JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new
        // String[] {"MM/dd/yyyy", "MM/dd/yyyy HH:mm", "MM/dd/yyyy HH:mm:ss"}));
        // JSONUtils.getMorpherRegistry().registerMorpher(new
        // TimestampToDateMorpher());
        if (jsonArray != null) {
            objs = new ArrayList<T>();
            List<T> list = (List<T>) JSONSerializer.toJava(jsonArray);
            for (Object o : list) {
                JSONObject jsonObject = JSONObject.fromObject(o);
                T obj = (T) JSONObject.toBean(jsonObject, clazz.getClass());
                objs.add(obj);
            }
        }
        return objs;
    }

使用方法:

List<xxModel> lists = getJavaCollection(new xxModel(), json);

for (xxModel model: lists) {
    //...
}

因为上面的 createDate 是日期类型,如果 getJavaCollection 方法中没写:

JSONUtils.getMorpherRegistry().registerMorpher(
                new DateMorpher(new String[] { "yyyy-MM-dd",
                        "yyyy-MM-dd‘T‘HH:mm", "yyyy-MM-dd‘T‘HH:mm:ss" }));

编译给设置 系统当前的日期,而且只能 是 年-月-日 的格式;时分秒都无法获取,没有提示错误;

关于json 日期 转为对象日期问题,这边怎么设置都没有成功,类似于 getJavaCollection 中相关注释掉部分的代码,获取出来还是只有年月日;

TimestampToDateMorpher 类代码 :[网上抄的]

public class TimestampToDateMorpher extends AbstractObjectMorpher {
    public Object morph(Object value) {
        if (value != null) {
            return new Date(Long.parseLong(String.valueOf(value)));
        }
        return null;
    }

    @Override
    public Class morphsTo() {
        return Date.class;
    }

    public boolean supports(Class clazz) {
        return Long.class.isAssignableFrom(clazz);
    }
}

最后是给 xxModel 再添加了个 日期字任串的代码;

private String createDateStr;

get set 代码略;

然后再 json 转为 java 对象后:

List<xxModel> lists = getJavaCollection(new xxModel(), json);

for (xxModel model: lists) {
    Date date = DateTime.parseDate(model.getCreateDateStr, "yyyy-MM-dd HH:mm");
    model.setCreateDate(date);
    //...
}

DateTime类下 parseDate 代码;

/**
     * 把时间转化为字符串
     * @param strdate
     * @return
     * @throws ParseException
     */
    public static Date parseDate(String strdate, String dateFormat) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.parse(strdate);
    }

另外,如果 model 中日期类型 有与 Hibernate 映射配置文件对应的,需要把 映射配置文件中 Date 类型改为: timestamp 才可以完整保存进 数据表;

7. spring 中 提交数据所对应的 RequestMapping 方法,如:

@RequestMapping(value = "/xxx", method=RequestMethod.POST)
public String postData(HttpServletRequest req, HttpServletResponse resp) {
    //...
}

有些情况下 ,一定还需要 @ResponseBody 注解,不然有可能会出现错误;

比如,如果项目数据库驱动是用 alibaba 的 druid 的话,就普通出现如下的错误:

java.sql.SQLException: connection holder is null

然后还会出现类似:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: getWriter() has already been called for this response

的问题,很奇怪;好像是说输出流,已经使用了某种输出方式,还用了另外的方式,就出现错误;

而且,如果返回方式 不为 String 的话,有可能也会出现错误异常;

8. Caused by: javax.el.PropertyNotFoundException Property ‘xxxx‘ not found on type xxx model

根据 JavaBeans 规范,属性的前两个字母不能是一大一小,或者是一小一大。开头字母要小写才行。

POJO:

private String XxxxName ;// 错误

9. JSP -- EL表达式 (调用java 类方法)

package xxx.yyy;
public class Commons {
    public static String unescapse(String str) {
          //...
          return str;
    }
}

jsp页面:

<%@ page import="com.utils.Commons" %> <!-- 可能不需要 -->
<jsp:useBean id="commons" class="com.utils.Commons" />

<c:forEach varStatus="vs" var="item" items="${addrs }">
     ${commons.unescape(item.name) }
</c:forEach>

用 page import 方法没有输出值: ${Commons.unescape(item.name)} 输出为 空;

时间: 2025-01-15 05:08:25

Spring: Jsp+Java 相关知识整理 (十三)的相关文章

JSP一些相关知识

JSP代码虽然看起来更像web页面而不像servlet,但是JSP在运行时会被转换成servlet JSP到servlet的转换过程一般在出现第一次页面请求时进行.JSP页面包括普通HTML代码还有脚本,指令和动作 脚本用来嵌入Java代码,并将其转换成servlet的一部分.JSP指令用来控制servlet的结构.动作用来引入组件或者控制JSP引擎 JSP Expression: <%= expression%> 计算表达式 并把输出结果转换成字符串 HostName = <%=req

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback

链表的相关知识整理

链表的相关知识整理 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 链表与数组的区别 回忆下数组的概念 ,所谓数组,是相同数据类型的元素按一定顺序排列的集合.根据概念我们可以知道数组在内存中连续,链表不连续:由于不同的存储方式导致数组静态分配内存,链表动态分配内存,数组

MFC相关知识整理

按:在该文档中整理我在做MFC相关编程时遇到的问题以及当时解决时所参考的资料.标准C/C++相关的问题不会放在这个帖子中,请移步:http://blog.csdn.net/edychang/article/details/37561701 1._T/_L宏:http://blog.csdn.net/panjean/article/details/6011090 2.CListCtrl: http://blog.csdn.net/bingxuewujian/article/details/7050

Redis相关知识整理

Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在缓存中,读取速度快,但是保存时间有限,最后按需要可以选择持久化到硬盘. b).mysql作为持久化数据库,每次访问都要在硬盘上进行I/O操作.频繁访问数据库会在反复连接数据库上花费大量时间.redis则会在缓存区存储大量频繁访问的数据,当浏览器访问数据的时候,先访问缓存,如果访问不到再进入数据库.

Java基础知识整理(一)

概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以便于自己的学习.作为个.NET程序猿也可以学习Java ,毕竟技多不压身,学习多也要精通. 开发工具 eclipse ,开发java类似.NET 需要装JDK类似.NET Framework. Java开发工具eclipse设置 1.设置字体:window设置: 2.设置快捷键:window--ke

cxf 相关知识整理

① 请求方式为GET @GET @Path(value = "/userAddressManage") @Produces( { MediaType.APPLICATION_JSON, "text/html; charset=UTF-8" }) public BuyerAddressResponseModel userAddressManage( @QueryParam("buyerTel") String buyerTel, @QueryPar

OpenCV&amp;Qt学习之四——OpenCV 实现人脸检测与相关知识整理

开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV. 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV 1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程运行起来.如果是新版的OpenCV跑旧的例程,编译运行出错的话,需要确保: #include

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign