Ha? Have a Talk. Menu

WEB

Permalink:

MyBatis批量更新

业务需要,要完成批量编辑产品名称。运用Mybatis的批量更新功能,同时因为需要更新的数据是iterator迭代出来的,所以需要在前端做一个标记。
产品有产品ID、产品名称两个属性:
product

public class Product extends BaseEntity {
    /** 产品ID */
    private String productId;
    /** 产品名称 */
    private String name;
    /** 产品列表查询 */
    private List productList;
    //以下省了get和set方法...
}

Controller

@Action(value = "updateProduct", results = { @Result(name = "success", location = "/pages/backstage/manage-product-list.jsp") })
public String updateProduct() {
    product = new Product();
    product.setProductList(productList);
    UpdateProductService service = new UpdateProductService();
    service.setEntity(product);
    service.excuteService();
    return "success";
}

Service

public class UpdateProductService extends BaseService {
    protected Object makeService(Product entity, SqlSession sqlSession) {
        ProductDao dao = sqlSession.getMapper(ProductDao.class);
        dao.updateProduct(entity);
        return entity;
    }
}

Dao

public interface ProductDao {
    public int updateProduct(Product product);
}

Sql

<insert id="updateProduct" parameterType="com.xxxxx.product.entity.Product">
    replace into product (
        product_id,name
    ) values
    <foreach collection="productList" item="productList"
        index="index" separator=",">
        (#{productList.productId},
         #{productList.name})
    </foreach>
</insert>
<!--此处其实就是运用Mybatis的foreach标签来拼sql-->

html

<body>
    <script type="text/javascript">
        $(function() {
            $("#btn-save").on('click', function() {
                $("#updateProduct").submit();
            })
        });
    </script>
    <div class="panel panel-default">
        <div class="panel-heading">产品列表</div>
        <div class="panel-body">
            <ul class="tool-bar">
                <li><a href="javascript:void(0);" id="btn-save"><span
                        class="glyphicon glyphicon-floppy-disk"></span> 保存</a></li>
            </ul>
            <div class="double-line"></div>
            <s:form role="form" action="updateProduct" method="post"
                namespace="/admin" theme="simple">
                <br />
                <ul class="list-group">
                    <s:iterator value="product.productList"
                        status="statusTest">
                        <li class="list-group-item list-group-item-text">
                            <h5>产品列表</h5> <s:hidden
                                name="%{'productList['+#statusTest.index+'].productId'}"
                                value="%{productId}"></s:hidden>
                            <div class="form-group input-group">
                                <span class="input-group-addon"> <span
                                    class="glyphicon glyphicon-pencil"></span> 标题
                                </span>
                                <s:textfield cssClass="form-control"
                                    name="%{'productList['+#statusTest.index+'].name'}"
                                    value="%{name}"></s:textfield>
                            </div>
                        </li>
                    </s:iterator>
                </ul>
            </s:form>
        </div>
    </div>

如下图所示:
edit-product

  • Thanks for leaving a comment, please keep it clean. HTML allowed is strong, code and a href.

Permalink:

jforum二次开发相关笔记——(一)页面请求机制

jforum二次开发相关笔记

1. 引言

jforum是Rafael Steil开发的一个基于JAVA的开源论坛,采用BSD开源协议,可以最大限度的进行任何修改和扩展,包括商业用途。它提供了诸如SSO之类的抽象接口,具有完全的权限控制、支持包括中文在内的十几种语言、可自定义的用户接口、安全、多数据库支持等特性。JForum 采用 FreeMarker作为页面模板引擎。jforum的介绍这里不再敷述,因项目需要,需要对jforum进行修改、实现从CS平台登录以后单点登录到jforum,因为jforum只支持唯一用户名标识,所以还需对jforum进行二次开发。(注:本文的jforum版本为2.1.9。)

2. jforum的页面请求机制

将jforum导入到eclipse可以参考《Java开源论坛JForum二次开发技术资料之导入安装》。以最简单的在一个登陆用户进入个人资料页为例:
jforum导航栏

2.1 处理url

用户点击个人资料,页面请求的url为/user/edit/session中获取的用户Id如header.htm源码所示:
/jforum/WebContent/templates/default/header.htm

<a id="myprofile" class="mainmenu" href="${JForumContext.encodeURL("/user/edit/${session.userId}")}">
<img src="${contextPath}/templates/${templateName}/images/icon_mini_profile.gif" border="0" alt="[Profile]" /> 
${I18n.getMessage("ForumBase.profile")}

JForum中的JForumContext.encodeURL方法(注:实现在/jforum/src/net/jforum/context/JForumContext.java下)根据请求的url中的useredit在modulesMapping.properties中查询user对应的配置项:

/jforum/WebContent/WEB-INF/config/modulesMapping.properties

user=net.jforum.view.forum.UserAction

2.2 查询action

根据请求的url中的edit在相应的UserAction中找到edit方法:

/jforum/src/net/jforum/view/forum/UserAction.java

public void edit() {
    if (this.canEdit()) {
        int userId = this.request.getIntParameter("user_id");
        UserDAO um = DataAccessDriver.getInstance().newUserDAO();
        User u = um.selectById(userId);
        this.context.put("u", u);
        this.context.put("action", "editSave");
        this.context.put(
                "pageTitle",
                I18n.getMessage("UserProfile.profileFor") + " " +u.getUsername());
        this.context.put("avatarAllowExternalUrl", SystemGlobals.getBoolValue(ConfigKeys.AVATAR_ALLOW_EXTERNAL_URL));
        this.setTemplateName(TemplateKeys.USER_EDIT);
    }
}

Continue reading…

  • Thanks for leaving a comment, please keep it clean. HTML allowed is strong, code and a href.

Permalink:

一个8块钱的域名引发的

开始

大前天,突然发现新网的.xyz域名只有8块钱(只有8块钱,你没有看错,你没有看错,不是98,不是48,是8块钱呵呵呵),于是我就注册了一个http://hehehe.xyz ,感觉这个域名和我气质还是挺相符的呵呵呵。
然后有了个域名,得搭个网站,之前的http://dacaitou.me是windows下用wordpress +sourceforge搭的,这回就换一个高级一点的Linux下用Jekyll + Github Page 好了。好的我们开始装Jekyll,那就看官方文档好了,(还可以参考Jekyll中文 、告别wordpress,拥抱jekyll)打开终端敲,好了,艾玛第一句终端就给我黑在那几分钟是闹哪样啊!!!
1
学长说gem的官方源经常卡住,没有问题,我们换成淘宝源。然后官方源顺利删掉了,但是淘宝源添不进去是要怎样啊。
2
会不会是ruby版本不够啊,更新到最新版,那啥还要装rvm,那就装吧(参考RVM 实用指南 、rvm 安装 Ruby ),装完再用rvm装个最新版的ruby吧,那啥,ruby还是1.9.2版本是闹哪样啊,然后就找啊找,找到一个说单用户模式安装要先切换,那就果不其然,淘宝源还是添不上啊摔。
Continue reading…

  • Thanks for leaving a comment, please keep it clean. HTML allowed is strong, code and a href.

Permalink:

网页中的中文自定义字体和@font-face

2016年4月28号更新:
现在有第三方的工具sfnttool可以直接裁剪中文字体文件,详见《中文字体其实也可以用在网页上的》

  最近在看Simon Garfield的《字体的故事》,相比英文字体,感觉中文字体虽然仅常用的字就达到了2500字,但是字体、字形多变,我大中华的文字真的是博大精深、源远流长啊,想到粉笔哥和他的方正显仁字体,又想到徐静蕾字体,初中时候班上好多女生字写的很漂亮,她们写的字体也都迥乎不同,03的柳体,00的行书。而英文只有26个字母,最常见的比如美漫对话中常用的Comic San、苹果早期软件菜单和对话框显示字体Chicago(现在好像是Helvetica)、等等字体改天看完再补上。英文字体给我的变化就像苹果手持设备的大小变来变去:ipod->变大->ipod touch->能打电话->iphone->变大->ipad->变小->ipad mini,又像ipod nano全系列的身材:苗条的ipod nano12->变矮胖->ipod nano3->变苗条->ipod nano45->矮胖到变成正方形->ipod nano6(6才是我的最爱,好想买啊T.T)->又变苗条->ipod nano7。详见这贴《形变神不变 苹果历代iPod nano变化史》。英文字体给我感觉就是变粗一个字体、变细又一个字体、加衬线又一个字体、加衬线字距增加有一个、线加粗又一个。

  不过字形多样的中文字体带来的一个大问题就是:在网页显示时,字体文件过于庞大,加载困难。比如接下来要提到的造字工房情书字体,otf格式就有4.1MB了,这在网页加载中绝对是个大问题,解决的办法之一就是给字体瘦身,自制或者说定制一个精简版的字体文件。

@font-face {
	font-family:qingshu;
	src: url('qingshu.eot');
	src: url('qingshu.eot?#iefix') format('eot'),
	url('qingshu.woff') format('woff'),
	url('qingshu.ttf') format('truetype'),
	url('qingshu.svg#webfontjKg17VrE') format('svg');
}

  我选的是最傻的办法,具体方法请戳《网页中使用自定义中文字体的解决方法》要用的字一个个复制到新字体工程里去,复制过去咋都没把unicode值也复制过去呢,还得自己一个个添,奇怪的是一个字有多种unicode,比如“子”字,直接用Font Creator居然找不到,要到网上找“子”的unicode,5B50,但是查到的“子”字不仅有5B50,主要显示的是2F26,后来发现这个“子”在康熙字典的213个边旁部首里,unicode是从 2F00到2FDF里,所以只能去查表才行。没去研究到底是不是所有的字体文件是这样的,总之,造字工房的情书字体这样的。

  另外还有一个问题是,IE浏览器独家兼容的EOT格式的字体文件愣是做不出来,换了多个做otf或者ttf转eot格式的网址或者工具都不行,比如Font Squirrelttf2eot,万恶的IE啊,还好转换好的TTF、OTF、SVG在safari和chrome能用。围观请戳《蚊子》

  • Smithd511

    Surely together with your thoughts here and that i adore your blog! Ive bookmarked it making sure that I can come back &amp read more inside the foreseeable future. dgddgdeefadeedka

  • Thanks for leaving a comment, please keep it clean. HTML allowed is strong, code and a href.