东东东 陈煜东的博客

月份存档: 三月 2013

Windows从noinstall zip安装MySQL免安装版

本篇适用于MySQL5.5版本,并已测试通过。对MySQL5.6来说,配置文件不能用。

安装MySQL作为开发的数据库,这是一个小程序员必备的。如果是开发大型的企业级程序,请选择企业级的数据库,比如Oracle、DB2,至于Microsoft的SQLServer就算了吧。

鉴于许多人在安装MySQL的时候出现许多的问题(大多使用MySQL的安装程序安装的),这里就写写MySQL的安装。

对于Windows的MySQL的安装其实很简单。个人推荐使用免安装版的MySQL,这种版本只要下来,解压缩后配置一下就可以使用了。而对那种安装包则就比较麻烦,本篇也不做介绍。因为周围有许多人的MySQL安装使用安装程序,而安装到一半,配置不会弄,MySQL数据库也弄的怪怪的。

第一步,下载MySQL的免安装版压缩包

好了,对于MySQL的免安装程序,我们先要下载一个MySQL的压缩包。下载地址:MySQL官网下载或者腾讯旋风分享下载

说明:在MySQL下载的时候,会有个让你login或sign up的按钮,不用注册了,看下方有个No thanks, just start my download.的链接。点击可直接下载,不用登录。

对于解压缩出来的MySQL,有几个配置文件样例,有my-small.ini、my-huge.ini等等,我们只要复制其中的一个,并命名为my.ini

Small: System has Medium: System has at least 64MB memory
Large: System has at least 512MB memory and the server will run mainly MySQL.
Huge: System has at least 1GB memory and the server will run mainly MySQL.
Heavy: System has at least 4GB memory and the server will run mainly MySQL.

第二步,配置MySQL

将第一步复制的配置文件my.ini打开,我们需要修改一下basedir(MySQL数据库的文件夹)和datadir(MySQL数据库的数据目录)。如下,

Example MySQL config file for medium systems.

#

This is for a system with little memory (32M – 64M) where MySQL plays

an important part, or systems up to 128M where MySQL is used together with

other programs (such as a web server)

#

You can copy this file to

/etc/my.cnf to set global options,

mysql-data-dir/my.cnf to set server-specific options (in this

installation this directory is C:\mysql\data) or

~/.my.cnf to set user-specific options.

#

In this file, you can use all long options that a program supports.

If you want to know which options a program supports, run the program

with the "–help" option.

The following options will be passed to all MySQL clients

[client]

password = your_password

port = 3306 socket = /tmp/mysql.sock

Here follows entries for some specific programs

The MySQL server

[mysqld] port = 3306 socket = /tmp/mysql.sock

skip-locking

key_buffer = 16M max_allowed_packet = 1M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M

set basedir to your installation path

basedir=E:/Program Files (x86)1/mysql-5.5.27-winx64

set datadir to the location of your data directory

datadir=E:/Program Files (x86)1/mysql-5.5.27-winx64/data

Don’t listen on a TCP/IP port at all. This can be a security enhancement,

if all processes that need to connect to mysqld run on the same host.

All interaction with mysqld must be made via Unix sockets or named pipes.

Note that using this option without enabling named pipes on Windows

(via the "enable-named-pipe" option) will render mysqld useless!

#

skip-networking

Disable Federated by default

skip-federated

Replication Master Server (default)

binary logging is required for replication

log-bin=mysql-bin

required unique id between 1 and 2^32 – 1

defaults to 1 if master-host is not set

but will not function as a master if omitted

server-id = 1

Replication Slave (comment out master section to use this)

#

To configure this host as a replication slave, you can choose between

two methods :

#

1) Use the CHANGE MASTER TO command (fully described in our manual) –

the syntax is:

#

CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,

MASTER_USER=<user>, MASTER_PASSWORD=<password> ;

#

where you replace <host>, <user>, <password> by quoted strings and

<port> by the master’s port number (3306 by default).

#

Example:

#

CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,

MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;

#

OR

#

2) Set the variables below. However, in case you choose this method, then

start replication for the first time (even unsuccessfully, for example

if you mistyped the password in master-password and the slave fails to

connect), the slave will create a master.info file, and any later

change in this file to the variables’ values below will be ignored and

overridden by the content of the master.info file, unless you shutdown

the slave server, delete master.info and restart the slaver server.

For that reason, you may want to leave the lines below untouched

(commented) and instead use CHANGE MASTER TO (see above)

#

required unique id between 2 and 2^32 – 1

(and different from the master)

defaults to 2 if master-host is set

but will not function as a slave if omitted

server-id = 2

#

The replication master for this slave – required

master-host = <hostname>

#

The username the slave will use for authentication when connecting

to the master – required

master-user = <username>

#

The password the slave will authenticate with when connecting to

the master – required

master-password = <password>

#

The port the master is listening on.

optional – defaults to 3306

master-port = <port>

#

binary logging – not required for slaves, but recommended

log-bin=mysql-bin

Point the following paths to different dedicated disks

tmpdir = /tmp/

log-update = /path-to-dedicated-directory/hostname

Uncomment the following if you are using BDB tables

bdb_cache_size = 4M

bdb_max_lock = 10000

Uncomment the following if you are using InnoDB tables

innodb_data_home_dir = C:\mysql\data/

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = C:\mysql\data/

innodb_log_arch_dir = C:\mysql\data/

You can set .._buffer_pool_size up to 50 – 80 %

of RAM but beware of setting memory usage too high

innodb_buffer_pool_size = 16M

innodb_additional_mem_pool_size = 2M

Set .._log_file_size to 25 % of buffer pool size

innodb_log_file_size = 5M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 1

innodb_lock_wait_timeout = 50

[mysqldump] quick max_allowed_packet = 16M

[mysql] no-auto-rehash

Remove the next comment character if you are not familiar with SQL

safe-updates

[isamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M

[myisamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M

[mysqlhotcopy] interactive-timeout

将这两处的地址换成自己的MySQL的地址,已经date目录。注意斜线的方向,使用E:/Program Files/mysql-5.5.27-winx64或者E:\Program Files\mysql-5.5.27-winx64。仅有这两处需要改动,其他不必改动了,除非特殊需要。

第三步,启动MySQL

要启动MySQL也很简单,打开命令提示符。输入一下两个命令

cd /d E:\Program Files\mysql-5.5.27-winx64\bin\
mysqld --console

友情提醒:为了以后的方便,将里面的内容保存到startmysql.bat文件里,以后只要双击bat就可以运行mysql了。

会出现以下内容就成功了。

130317 20:11:05 [Note] Plugin 'FEDERATED' is disabled.
130317 20:11:05 InnoDB: The InnoDB memory heap is disabled
130317 20:11:05 InnoDB: Mutexes and rw_locks use Windows interlocked functions
130317 20:11:05 InnoDB: Compressed tables use zlib 1.2.3
130317 20:11:05 InnoDB: Initializing buffer pool, size = 128.0M
130317 20:11:05 InnoDB: Completed initialization of buffer pool
130317 20:11:05 InnoDB: highest supported file format is Barracuda.
130317 20:11:06  InnoDB: Waiting for the background threads to start
130317 20:11:07 InnoDB: 1.1.8 started; log sequence number 14128205
130317 20:11:07 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
130317 20:11:07 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
130317 20:11:07 [Note] Server socket created on IP: '0.0.0.0'.
130317 20:11:07 [Note] Event Scheduler: Loaded 0 events
130317 20:11:07 [Note] mysqld: ready for connections.
Version: '5.5.27-log'  socket: ''  port: 3306  MySQL Community Server (GPL)

第四步:更改MySQL密码

默认MySQL的root密码为空的,在某些地方,密码不能输入为空,所以需要更改密码。

首先先启动MySQL数据库,可以使用上面的bat启动MySQL。

然后根据下面的命令进行更改

mysql -u root -p #从命令行中进入mysql的客户端
use mysql;  #使用mysql这个数据库
update user set password=password("root") where user="root"; #对root密码进行更改
FLUSH PRIVILEGES; #刷新一下权限

安装到Windows service服务开机自动启动

如果需要将MySQL开机自动运行,并且以服务的形式存在,那么按照本方法进行即可。以服务的形式打开MySQL,就不用再适用上面的批处理文件了。

先停止MySQL Server的运行。以管理员方式运行命令提示符

向Windows添加服务

E:\Program Files\mysql-5.5.27-winx64\bin>mysqld --install MySQL5.5
Service successfully installed.

使用mysqld 并使用参数--install MySQL5.5,说明向服务注册一个叫MySQL5.5的服务名,如果不加服务名,则使用默认的MySQL作为服务名。

注意:使用--install 参数添加的服务为开机自动启动的。如果想要使用手工启动,那么使用参数--install-manual代替。命令mysqld --install-manual添加服务,需要手工启动服务。

启动MySQL服务

第二步只是向Windows服务添加了一个MySQL5.5的服务,但是并没有启动。可以到Windows服务里启动,或者使用命令行(需要管理员权限)

C:\> net start MySQL5.5
MySQL5.5 服务正在启动 .
MySQL5.5 服务已经启动成功。

从服务中停止MySQL服务

C:\> net stop MySQL5.5
MySQL5.5 服务正在停止.
MySQL5.5 服务已成功停止。

删除Windows的MySQL服务

E:\Program Files\mysql-5.5.27-winx64\bin>mysqld --remove MySQL5.5
Service successfully removed.

参考文章:Installing MySQL on Microsoft Windows Using a noinstall Zip Archive

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Windows从noinstall zip安装MySQL免安装版 – https://www.chenyudong.com/archives/installing-mysql-on-microsoft-windows-using-a-noinstall-zip-archive.html

分类: 网站建设

搜狗输入法吐槽

吐槽一下搜狗输入法。

我使用搜狗拼音输入法并没有多长时间,周围的很多人都在使用搜狗输入法。我承认搜狗输入法在输入中文上有很多优势,比如手机版的按错到相邻的字母时,会自动给出一个可能的候选的词组给你,这个功能不错。因为有人在win8上安装了搜狗输入法,但是在焦点框变化时,输入法会切换。这个可能是设置的时候,默认开启了搜狗输入法的界面。

为了帮他人解决这个问题,我在自己的电脑上安装了一个搜狗输入法。国内的许多企业的软件都有许多的默认的选项,如果一不小心就会给你安装了其他捆绑的软件(国外的软件也有,但都一般在最后。国内几个大的PC客户端的软件都会在第一步勾选捆版软件,然后是安装过程,然后再勾一些捆版的软件)。这样,许多不知情也不关心的用户只直接下一步的点击,完全不管上面的勾选安装信息,就这样安装了许多的其他的软件。于是就说电脑如何如何的慢,这些软件大部分都是开机自动运行,于是后台也就开启了许多的程序,动不动的弹个窗口,或者来个大个的门户新闻框。感觉电脑要被上面的软件给占领了。跑题了,应该是吐槽搜狗输入法的,怎么变成全部的软件了?

搜狗输入法给我的感觉就是

1.皮肤很多,还很漂亮。但是默认的就比较难看了,特别是字体。

2.选项也特别多!以至于我都不知道自己要把哪个给勾选,哪个去除。想要弄一个适合自己的都不想去弄了,我需要的功能也不是太多,只是把候选数调到9个而以,字体变大些。

3.弹窗,好吧,这个都有的毛病,不说了,不过可以在设置中给关闭了的。

4.对了,自动更新词库。我觉得我基本上用不着这个功能,自动更新词库不也就造成硬盘空间增大了。应该可以关闭。

5.输入法选项关闭难。在系统中禁用了搜狗输入法选项了,可是还是有搜狗输入法的图标。而且还是和没禁用了一样,照样可以用。我觉得要重启系统吧,于是重启了,发现还是有,我觉得有自动启动选项了吧,禁用了还是有。不得已,卸载了。

还没帮那同学解决问题,我就自己被搜狗输入法给困恼了。改天到他电脑上设置设置吧。

我一直使用Google拼音输入法,手机版的输入法也没有提示相邻字符的功能。功能也没那么多,更新也没那么频繁,好久才更新一次。不过界面简洁。要不是Google输入法对win8支持不好,我就不会用微软拼音了。在使用Google输入法的时候,java会自动奔溃退出了。

不知道QQ输入法如何?好像界面也是比较清新的。

win8的输入法就感觉就微软输入法用的还比较顺畅,什么时候Google拼音才能好用啊。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 搜狗输入法吐槽 – https://www.chenyudong.com/archives/complaint-about-sogou-input.html

分类: 软件

hibernate实体自关联映射

近日在开发系统的一个功能的时候出现问题了,花了6天寻找解决方案。先来看看数据库的category表

数据库category结构
类型
id int(11)
name varchar(255)
parent int(11)

遇见的问题

问题表述:当我从数据库中根据id取出一个category出来的时候,对名字进行更改,然后再保存,就会在数据库中insert一条父记录。此困惑确实不解。还有就是使用junit使用模拟http请求测试也不会出问题使用tomcat就又insert了。

Hibernate对象的3中状态

对于出现的问题有,说保存了一个瞬时对象,不能保存。hibernate object references an unsaved transient instance。关于瞬时态(transien)、游离态(detached、托管态)、持久态(persistent)这里有张图

Hibernate对象的3种状态,瞬时态(transien)、游离态(detached)、持久态(persistent)。通过hibernate的save、update等方法进行转换。 图片来源:http://blog.csdn.net/xiaokaibupabupa/article/details/6785208

有说法是从数据库中取出一个对象,状态变成持久态,在session关闭后,就变成游离态。要想关联的parent目录也想要持久态,需要在hibernate的映射文件中需要使用cascade=”all”或者cascade=”save-update”能使父目录变为持久态。但是我在设添加此设置不管用,还是会想数据库insert一条记录。

我让许多同学来查看代码,都觉得没有什么问题,我就让我同学在自己的电脑上假设一个环境来测试,在他的电脑上也没问题。将同学的配置文件弄到自己的机器上测试,过了许多天,这个问题都没解决。

于是我就从MyEclipse的自带的Hibernate Inverse Engineering功能从数据库导出DAO文件、pojo文件、映射文件。然后将我自己的映射文件按照自动生成的来替换。但是还是不行。

更为烦恼的是,自己使用junit写的测试用例,来模拟http请求,能正确执行,但是通过tomcat来运行就又会出现insert的情况。

不过我在查看控制台的输出的时候,发现取出category进行了一个事务和session,update的时候又进行了一个事务和session。我觉得有点问题,因为这样使用了两个事务,我觉得在Spring的配置事务出现了一些问题。

现在把处理category逻辑放到了service层来进行,本来是在action层,感觉情况有些好转。

hibernate映射文件

把配置文件给贴出来看看,hibernate对象自关联自身配置。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.chenyudong.pojo.Category" >
        <id name="id" column="id" >
            <generator class="identity" ></generator>
        </id>
        <property name="name" column="name" />
        <set name="childCategory" inverse="true" cascade="all"  fetch="join" lazy="false">
            <key column="parentID"></key>
            <one-to-many class="com.chenyudong.pojo.Category" />
        </set>
        <many-to-one name="parent" class="com.chenyudong.pojo.Category"
            column="parentID" ></many-to-one>
    </class>  
</hibernate-mapping>

我们可以看见,在外键的一方,需要使用many-to-one或者其他的one-to-one或者one-to-manymany-to-many配置映射关系。此hibernate的映射关系,相当于数据库中的外键关联。many-to-one说明可以多个目录的parentID相同,指向同一个父目录。而set这个标签,则用于主键一方上,表明指向该记录的集合。

属性inverse描述的是对象之间关联关系的控制方向,也就是由哪个对象来维护他们之间的关联,而属性casade描述的是层级之间的连锁操作方式,也就是一个对象的改变是否也要同步对其管理对象进行相应的操作。

嗯,在耽误了许久的项目后继续赶进度了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: hibernate实体自关联映射 – https://www.chenyudong.com/archives/hibernate-entity-self-reference-mapping.html

分类: JavaEE

struts里不能获得request的参数

文章标题说不能从parameter中获得参数有点言过其实了,只是在不能使用某种方式来获得参数值。

最近在写一个系统,使用了struts2+spring+hibernate的架构。为了将jsp的页面进行模块化,将相同的部分抽取出来,形成一个单独的文件。然后使用strtus的<s:include>标签导入相同的文章。

示例demo,一个newPost.jsp,一个ajax/post.jsp,我们要在某个目录下添加文章,假设访问url:/newPost.jsp?category=2

<div id="contentDiv">
    <s:property value="#request[category]"/><!-- 显示2 -->
    <s:include value="admin-sidemenu.jsp">
        <s:param name="activeItem"  value="%{'add-post'}"></s:param>
    </s:include>

    <!-- main -->
    <div id="mainDiv">
        <s:include value="ajax/post.jsp"></s:include>
    </div>
    <!-- main end -->

    <s:property value="#request[category]"/><!-- 不工作了 -->
</div>
<%@page import="com.opensymphony.xwork2.ognl.OgnlValueStack"%>
<%    ((OgnlValueStack) request.getAttribute("struts.valueStack")).set(
            "activeItem", request.getParameter("activeItem"));
%>
<s:property value="activeItem"/><!-- 自己弄得valueStack这里能工作 -->
<s:property value="#request[category]"/><!-- 显示2 -->
<s:property value="#request.category"/><!-- 显示2 -->
<s:action name="category!categorys"></s:action>
<s:select name="categoryID" list="#request.categorys"
    listKey="categoryID" listValue="categoryName" headerKey="0"
    headerValue="未分类" id="articleCategory" theme="simple"
    value="#request[category]"><!-- 不工作了 -->
</s:select>
    说明:
  1. newPost.jsp:4因为要在admin-sidemenu.jsp页面中高亮当前的菜单,所以需要向该页面传入参数,以确定需要高亮显示的菜单。
  2. newPost.jsp:9因为要在ajax/post.jsp页面中默认选中目录,所以使用了#request[category]来获得category的值。
  3. newPost.jsp:2为了验证#request[category]是否工作而设置的。结果显示2
  4. ajax.post.jsp:1这里能工作,显示2
  5. ajax.post.jsp:2这里能工作,显示2
  6. ajax.post.jsp:7这里不工作,不默认自己选中
  7. newPost.jsp:13为了验证#request[category]在这里是否工作。结果不显示

虽然在<s:include>使用<s:param>标签想admin-sidemenu.jsp页面传入参数,然后再admin-sidemenu.jsp取出参数苦恼了许多问题。经过多种尝试,找到了自己喜欢的解决方案,获取include的方法请查看获取struts2 include标签param参数

但是在newPost.jsp后来居然获取不到#request[category]的值了!此前能取值,而且在ajax/post.jsp中的select标签也不能正常工作了。正是奇怪。

应该是把admin-menu.jsp中弄了个自己的valueStack,搞得有点乱了。所以还是把这个去了吧,改用我自己喜欢的include方法传参数,取参数值。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: struts里不能获得request的参数 – https://www.chenyudong.com/archives/does-not-access-request-parameters-in-strust-include.html

分类: 网站建设

用junit对struts2 action和spring进行单元测试

对action和spring进行测试,就不用再开tomcat了,此方法就是模拟用户的http请求进行的,但是这个方法不能看页面的工作情况,但对action的测试足够了。

此测试方法参考了http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/ ,此方法在我的代码中不能正常工作,需要改动。

首先需要的jar文件:spring-test-3.05.RELEASE.jar、spring-core-3.1.5RELEASE.jar,文中并没有给出相关依赖jar包。

public class PersonAction extend ActionSupport {

  private int id;

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String deletePerson() {
    ....
    return SUCCESS;
  }
}
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;
import junit.framework.TestCase;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.views.JspSupportServlet;
import org.springframework.context.ApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.ContextLoader;

import java.util.HashMap;

/**
 * @author Zarar Siddiqi
 */
public abstract class BaseStrutsTestCase extends TestCase {
    private static final String CONFIG_LOCATIONS = "file:WebRoot/WEB-INF/applicationContext.xml";
    private static ApplicationContext applicationContext;
    private Dispatcher dispatcher;
    protected ActionProxy proxy;
    protected static MockServletContext servletContext;
    protected static MockServletConfig servletConfig;
    protected MockHttpServletRequest request;
    protected MockHttpServletResponse response;

    public BaseStrutsTestCase(String name) {
        super(name);
    }

    /**
     * Created action class based on namespace and name
     * @param clazz Class for which to create Action
     * @param namespace Namespace of action
     * @param name Action name
     * @return Action class
     * @throws Exception Catch-all exception
     */
    @SuppressWarnings("unchecked")
    protected <T> T createAction(Class<T> clazz, String namespace, String name)
            throws Exception {

        // create a proxy class which is just a wrapper around the action call.
        // The proxy is created by checking the namespace and name against the
        // struts.xml configuration
        proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class).
                createActionProxy(
                namespace, name, null, true, false);

        // by default, don't pass in any request parameters
        proxy.getInvocation().getInvocationContext().
                setParameters(new HashMap());

        // do not execute the result after executing the action
        proxy.setExecuteResult(true);

        // set the actions context to the one which the proxy is using
        ServletActionContext.setContext(
                proxy.getInvocation().getInvocationContext());
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
        ServletActionContext.setRequest(request);
        ServletActionContext.setResponse(response);
        ServletActionContext.setServletContext(servletContext);
        return (T) proxy.getAction();
    }

    protected void setUp() throws Exception {
        if( applicationContext == null ) {
            // this is the first time so initialize Spring context
            servletContext = new MockServletContext();
            servletContext.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
                    CONFIG_LOCATIONS);
            applicationContext = (new ContextLoader()).initWebApplicationContext(servletContext);

            // Struts JSP support servlet (for Freemarker)
            new JspSupportServlet().init(new MockServletConfig(servletContext));
        }
        // Dispatcher is the guy that actually handles all requests.  Pass in
        // an empty. Map as the parameters but if you want to change stuff like
        // what config files to read, you need to specify them here.  Here's how to
        // scan packages for actions (thanks to Hardy Ferentschik - Comment 66)
        // (see Dispatcher's source code)
        HashMap params = new HashMap();
        params.put("actionPackages", "com.test.action");
        dispatcher = new Dispatcher(servletContext, params);
        dispatcher.init();
        Dispatcher.setInstance(dispatcher);
    }
}

文中第20行在我的myeclipse不能工作,本来按原文的方法是抛出FileNotFound异常,采用改为file:WebRoot/WEB-INF/applicationContext.xml来解决的。其中第87行需要改成自己的包名。

public class PersonActionTest extends BaseStrutsTestCase {

 /**
  * Invoke all interceptors and specify value of the action
  * class' domain objects directly.
  * @throws Exception Exception
  */
 public void testInterceptorsBySettingDomainObjects()
         throws Exception {
  PersonAction action = createAction(PersonAction.class,
                "/site", "deletePerson");
  action.setId(123);
  String result = proxy.execute();
  assertEquals(result, "success");
 }

 /**
  * Invoke all interceptors and specify value of action class'
  * domain objects through request parameters.
  * @throws Exception Exception
  */
 public void testInterceptorsBySettingRequestParameters()
                     throws Exception {
  createAction(PersonAction.class, "/site", "deletePerson");
  request.addParameter("id", "123");
  String result = proxy.execute();
  assertEquals(result, "success");
 }

 /**
  * Skip interceptors and specify value of action class'
  * domain objects by setting them directly.
  * @throws Exception Exception
  */
 public void testActionAndSkipInterceptors() throws Exception {
  PersonAction action = createAction(PersonAction.class,
                  "/site", "deletePerson");
  action.setId(123);
  String result = action.deletePerson();
  assertEquals(result, "success");
 }
}

自己编写testcase继承该类即可。按照这个格式编写测试用例。

另外的junit方法,查看http://developer.51cto.com/art/201108/282751.htm

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 用junit对struts2 action和spring进行单元测试 – https://www.chenyudong.com/archives/unit-testing-struts-2-actions-and-spring-using-junit.html

分类: 网站建设

遭遇第一次网络安全攻击

网站应该遭受了攻击。攻击者ip:220.181.55.29。搜索此ip地址,发现有许多的此ip的记录,在其他页面提交了许多垃圾评论。

在今天的下午15:50,滴的一身,来了一个短信,一看短信内容,是几个135791这几个数字,以为是普通的机器人在网站上提交留言了。并不在意。随着连续的几次相同的短信内容,也并不在意,以为飞信抽了,相同内容的短信发了多次。可是在短短的10分钟内,访问了许多并不存在的页面。

http://www.daoiqi.com/wui/pay/index.php?f=credit&amp;p=cmb%7Cping+-c+8+127.0.0.1

因为我的反馈页面给邮箱发邮件,同时用飞信给我发短信,导致我的手机频繁的收到短信。不得已将反馈页面给关闭了。

对了,还有许多的http request头是pylib。

有人说是来自360的安全检测。webscan.360.cn的ip为123.125.80.244。还不确定。ip123.125.160.216是360检测的一个ip,其他ip不知道。

测试是否是360检测引起的。不知道情况下,我再次去检测把原来的页面挂上去,然后再进行检测,如果还有非常的多提交反馈表单,那就是360引起的了。如果没有,那就暂时排除360导致的。

于是我又查看了博客的访问情况,发现来自ip:123.151.39.42的页有许多,访问sqladmin、myadmin等数据库管理软件的后台。应该是想寻找数据库的密码。 www.scanv.com的ip为123.151.39.27,这次很可能是这个网站检测引起的。

——————–update on 19:06 ———————

晚间19点多,又有来自220.181.55.30的ip的访问。

访问这样的url

/star.vancl.com/fashionsuit/products/?vp=27547%2c27614&jp=135791&cid=333%2c4019988%bf%27or+3%3D3+limit+1%23

———-update on 2013/3/30 10:00———

早上查看网站访问日志,发现来自117.42.72.100的ip在7点对网站进行扫描,立刻拒绝此ip的访问。在此时间07:11:15、07:18:57、07:23:42、07:27:26、07:46:48、07:57:31、08:15:38、08:39:28、08:58:26、09:03:09多次进行扫描。不知道是为什么呢?在拿我的网站检测做实验?还是初步学习攻击网络攻击?

扫描页面有

117.42.72.100 - - [10/Mar/2013:07:11:15 +0800] "HEAD /wwwroot.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
.......................
117.42.72.100 - - [10/Mar/2013:07:11:41 +0800] "HEAD /www_daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"

117.42.72.100 - - [10/Mar/2013:07:18:57 +0800] "HEAD /wwwroot.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
.......................
117.42.72.100 - - [10/Mar/2013:07:19:26 +0800] "HEAD /www_daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"



117.42.72.100 - - [10/Mar/2013:08:58:26 +0800] "HEAD /wwwroot.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:26 +0800] "HEAD /wwwroot.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:26 +0800] "HEAD /wwwroot.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:26 +0800] "HEAD /wwwroot.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:27 +0800] "HEAD /HYTop.mdb HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:27 +0800] "HEAD /www.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:27 +0800] "HEAD /www.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:27 +0800] "HEAD /www.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:28 +0800] "HEAD /www.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:28 +0800] "HEAD /web.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:28 +0800] "HEAD /www.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:28 +0800] "HEAD /web.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:28 +0800] "HEAD /www.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:29 +0800] "HEAD /www.daoiqi.com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:29 +0800] "HEAD /www.daoiqi.com.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:29 +0800] "HEAD /www.daoiqi.com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:30 +0800] "HEAD /wwwdaoiqicom.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:30 +0800] "HEAD /wwwdaoiqicom.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:30 +0800] "HEAD /wwwdaoiqicom.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:30 +0800] "HEAD /wwwdaoiqicom.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:31 +0800] "HEAD /daoiqi.com.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:31 +0800] "HEAD /daoiqi.com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:31 +0800] "HEAD /daoiqi.com.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:31 +0800] "HEAD /daoiqi.com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:31 +0800] "HEAD /daoiqi.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:32 +0800] "HEAD /daoiqi.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:32 +0800] "HEAD /daoiqi.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:32 +0800] "HEAD /daoiqi.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:32 +0800] "HEAD /daoiqi_com.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:33 +0800] "HEAD /daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:33 +0800] "HEAD /daoiqi_com.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:33 +0800] "HEAD /daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:33 +0800] "HEAD /www_daoiqi_com.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:33 +0800] "HEAD /www_daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:34 +0800] "HEAD /www_daoiqi_com.zip HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
117.42.72.100 - - [10/Mar/2013:08:58:34 +0800] "HEAD /www_daoiqi_com.tgr.gz HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"

117.42.72.100 - - [10/Mar/2013:09:03:09 +0800] "HEAD /wwwroot.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
..................................
117.42.72.100 - - [10/Mar/2013:09:03:35 +0800] "HEAD /www_daoiqi_com.rar HTTP/1.1" 404 - "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"

这是要下载网站的源代码,还有想看数据库的呀。

此次攻击总结反思

经过此次事件,进行一些总结反思。

不要在网站的根目录下放网站的源代码和数据库文件。不然攻击这会进行扫描目录。或者至少别直接放文件名和网站域名相关的重要文件。

出现异常的访问情况,可以先将其拒绝访问,以防止其攻击造成系统资源浪费。

平时得多注意网站的安全。

注意密码的保存。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 遭遇第一次网络安全攻击 – https://www.chenyudong.com/archives/against-first-security-website-attacked.html

分类: 网络

获取struts2 include标签param参数

struts 2的标签中,有个<s:include>标签,这个标签能将其他页面给包含到本页面。使用这个语法,能将网页给模块化了。不用写一个长长的页面,将相同的部分给抽取出来,从而复用代码。

同时,我们也可以向要include进来的页面传入参数。在被include的页面中,我们可以读取。

向include传入参数

<s:include value="myJsp.jsp" />
<s:include value="myJsp.jsp">
   <s:param name="param1" value="value2" />
   <s:param name="param2" value="value2" />
</s:include>
<s:include value="myJsp.jsp">
   <s:param name="param1">value1</s:param>
   <s:param name="param2">value2</s:param>
</s:include>

取参数方法一:${param.ParamName}官方的唯一方法

在被include页中取出参数,在myJsp.jsp页面中,获得参数的方法就是${param.ParamName}。

<div>通过这样取出参数值${param.param1}</div>

对了,要获得参数必须使用param这个对象。根据官方的struts include document说明,只能通过${param.param1}这样取出,其他方法不能直接取出来,<s:property>标签不能取出参数。

注意:不要在<s:property>标签的属性里使用${}标记,${}能够在html代码中直接显示。如果需要,请查阅Expression Language (EL)

取参数方法二:利用request对象来传递

include传参数还是一样的方法。但是在取参数,使用里一些小技巧。

<% pageContext.setAttribute("myparam" , request.getParameter("param1")); %>           
<s:property value="#attr.myparam"/>

通过pageContext对象来设置参数,或者你也可以使用request对象来实现参数的设置。有点投机了,不过此方法只能取字符串?为什么我不能获得其他值呢?

取参数方法三:不用include传入参数,在外头定义约定变量

<s:set name="param1" value="#request.user" />
<s:include value="myJsp.jsp" />

此方法有点投机取巧了。没有经过include标签传入参数,但在外头定义一个变量,在myJsp.jsp页取得共同约定的变量也不错。这样,在myJsp.jsp页中可以使用struts标签,和正常的情况一样使用,用起来很方便。个人喜欢使用这个方法。

取参数方法四:自己设置valueStack

参考文章来源:http://blog.csdn.net/james_wu_shanghai/article/details/4034739

在myJsp.jsp页面中自己忘valueStack添加自己的值。

<%@page import="com.opensymphony.xwork2.ognl.OgnlValueStack"%>
<%
 ((OgnlValueStack) request.getAttribute("struts.valueStack")).set(
   "operation", request.getParameter("operation"));
%>

<s:property value="operation"/>

此方法本人也用过,能正常工作,但是在其他页面出现问题了,详情请查看struts里不能获得request的参数。立刻将此方法撤下了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 获取struts2 include标签param参数 – https://www.chenyudong.com/archives/access-struts2-include-tag-parameter-in-another-jsp-page.html

分类: 网站建设

jsp页面使用ckeditor所见即所得html编辑器

CKEditor所见即所得html文本编辑器。网址:http://ckeditor.com/

CKEditor是什么

CKEditor是一个网页编辑器。我们先看看到底长什么样,进入http://ckeditor.com/demo看看示例页面。好有个直观的认识。

CKEditor是放在网页上的,一个开源的所见即所得(What You See IWhat You Get,简称WYSIWYG)的编辑器,是目前最流行的html文本编辑器。兼容主流的浏览器,支持多种编程语言,有PHP、JavaScript、Java、ASP.NET、ColdFusion。

CKEditor是FCKEditor的一个成功继任者。“FCKeditor”名称中的“FCK” 是开发者的名字Frederico Caldeira Knabben的首字母缩写。从2003年开始,在2009年更新到3.0并改名为CKEdirot。

在JSP上安装CKEditor

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: jsp页面使用ckeditor所见即所得html编辑器 – https://www.chenyudong.com/archives/java-web-install-ckeditor-wysiwyg-html-text-editor-in-jsp.html

分类: 网站建设

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑