03

首先创建代表产品的类cn.org.jock.Product,代码如下:


package cn.org.jock;

import java.sql.Date;

public class Product {
private String name;
private double price;
private Date dateOfProduction;

public Date getDateOfProduction() {
return dateOfProduction;
}

public void setDateOfProduction(Date dateOfProduction) {
this .dateOfProduction = dateOfProduction;
}

public String getName() {
return name;
}

public void setName(String name) {
this .name = name;
}

public double getPrice() {
return price;
}

public void setPrice( double price) {
this .price = price;
}
}

本例子中的dateOfProduction属性使用了java.sql.Date,而不是java.util.Date。这是因为Struts 1.x不支持请求参数到java.util.Date的转换,归根到底是由于org.apache.commons.beanutils.ConvertUtilsBean.convert()不支持关于java.util.Date的转换。另外,值得注意的是common-beanutils是通过java.sql.Date.valueOf()方法工作的,所以在页面输入的字符串的格式必须为“yyyy-MM-dd”。

表单(Actoin Form)+ 列表(List)

首先,我们要创建类cn.org.jock.struts.util.AutoInitArrayList,代码如下:

/**
*
*/
package cn.org.jock.struts.util;

import java.util.ArrayList;

/**
* @author Jock
*
*/
public class AutoInitArrayList extends ArrayList {
private static final long serialVersionUID = 1L ;

private Class t = null ;

public AutoInitArrayList(Class t) {
this.t = t;
}

@Override
public E get( int index) {
try {
while (index >= size()) {
add(t.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
return super .get(index);
}

}

AutoInitArrayList继承ArrayList并重载get()方法,作用就是在Struts 1.x框架调用这个方法时,如果index超出列表大小,则会实例化新项放到列表中,避免出现(IndexOutOfBoundsException)异常。 更多详细内容 »

Tags: , ,

作者:Jock

03

方法一:
在/usr/local/mysql/bin/下:

./mysqladmin -u root password 'new_password'

一般安装时用此方法设置。

方法二:
在mysql状态下:

mysql>UPDATE user SET password=PASSWORD('new_password') WHERE user='root';
mysql>FLUSH PRIVILEGES;

方法三:

mysql>SET PASSWORD FOR root=PASSWORD('new_password');

方法四:(忘记了root密码)
如果忘记了 MySQL 的 root 密码,可以用以下方法重新设置:
1. KILL掉系统里的MySQL进程;

2. 用以下命令启动MySQL,以不检查权限的方式启动; 更多详细内容 »

Tags: ,

作者:堕落天使

09
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package cn.org.jock.http.listener;
 
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author jock
*
*/
public class SessionListener implements HttpSessionListener {
 // 集合对象,保存session 对象的引用
 static Hashtable<String,HttpSession> ht = new Hashtable<String,HttpSession>();
 // 实现HttpSessionListener接口,完成session创建事件控制
 public void sessionCreated(HttpSessionEvent arg0) {
   HttpSession session = arg0.getSession();
   ht.put(session.getId(), session);
   System.out.println("create session :" + session.getId());
 }
 
 // 实现HttpSessionListener接口,完成session销毁事件控制
 public void sessionDestroyed(HttpSessionEvent arg0) {
   HttpSession session = arg0.getSession();
   System.out.println("destory session :" + session.getId());
   ht.remove(session.getId());
 }
 
 // 返回全部session对象集合
 
 static public Iterator getSet() {
   return ht.values().iterator();
 }
 
 // 依据session id返回指定的session对象
 static public HttpSession getSession(String sessionId) {
   return (HttpSession) ht.get(sessionId);
 }
 
}

别忘了在web.xml里加上
<listener>
   <listener-class>cn.org.jock.http.listener.SessionListener</listener-class>
</listener>

有了这个就可以方便的做很多事了,统计在线人数、在线列表、用户单一登陆等等,自己扩展吧。

Tags: , ,

作者:堕落天使

十二 21

为一个基于Struts的Web应用添加一个处理退出问题的框架可以优雅地不费气力的实现。这部分归功于Struts是采用MVC设计模式的因此将模型和视图清晰的分开。另外,Java是一个面向对象的语言,其支持继承,可以比JSP中的脚本更为容易地实现代码重用。在Struts中,清单4中的代码可以从JSP页面中移植到Action类的execute()方法中。
此外,我们还可以定义一个继承Struts Action类的基本类,其execute()方法中包含了清单4中的代码。通过使用类继承机制,其他类可以继承基本类中的通用逻辑来设置HTTP头信息以及检索HttpSession对象中的username字符串。这个基本类是一个抽象类并定义了一个抽象方法executeAction()。所有继承自基类的子类都应实现exectuteAction()方法而不是覆盖它。清单6是基类的部分代码:

  清单6

public abstract class BaseAction extends Action {
 public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException {
  response.setHeader("Cache-Control","no-cache");
  //Forces caches to obtain a new copy of the page from the origin server
  response.setHeader("Cache-Control","no-store");
  //Directs caches not to store the page under any circumstance
  response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
  response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility

  if (!this.userIsLoggedIn(request)) {
   ActionErrors errors = new ActionErrors();
   errors.add("error", new ActionError("logon.sessionEnded"));
   this.saveErrors(request, errors);
   return mapping.findForward("sessionEnded");
  }
  return executeAction(mapping, form, request, response);
 }

 protected abstract ActionForward executeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException;

 private boolean userIsLoggedIn(HttpServletRequest request) {
  if (request.getSession().getAttribute("User") == null) {
   return false;
  }

  return true;
 }
}

  清单6中的代码与清单4中的很相像,仅仅只是用ActionMapping findForward替代了RequestDispatcher forward。清单6中,如果在HttpSession中未找到username字符串,ActionMapping对象将找到名为sessionEnded的forward元素并跳转到对应的path。如果找到了,子类将执行其实现了executeAction()方法的业务逻辑。因此,在配置文件struts-web.xml中为所有子类声明个一名为sessionEnded的forward元素是必须的。清单7以secure1 action阐明了这样一个声明:

  清单7

<action path="/secure1"
type="com.kevinhle.logoutSampleStruts.Secure1Action"
scope="request">
<forward name="success" path="/WEB-INF/jsps/secure1.jsp"/>
<forward name="sessionEnded" path="/login.jsp"/>
</action>

  继承自BaseAction类的子类Secure1Action实现了executeAction()方法而不是覆盖它。Secure1Action类不执行任何退出代码,如清单8:

public class Secure1Action extends BaseAction {
 public ActionForward executeAction(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException {

  HttpSession session = request.getSession();
  return (mapping.findForward("success"));
 }
}

  只需要定义一个基类而不需要额外的代码工作,上述解决方案是优雅而有效的。不管怎样,将通用的行为方法写成一个继承StrutsAction的基类是许多Struts项目的共同经验,值得推荐。

Tags:

作者:Jock

十一 04

一、避免在循环条件中使用复杂表达式

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而
使循环条件值不变的话,程序将会运行的更快。

例子:
import java.util.Vector;
class CEL {
   void method (Vector vector) {
       for (int i = 0; i < vector.size (); i++)  // Violation
           ; // …
   }
}

更正:
class CEL_fixed {
   void method (Vector vector) {
       int size = vector.size ()
       for (int i = 0; i < size; i++)
           ; // …
   }
}

二、为‘Vectors‘ 和 ‘Hashtables‘定义初始大小 更多详细内容 »

Tags:

作者:Jock

十一 04

☆在程序管理菜单下,直接按C键就可以删程序了

☆待机下长按数字0键就可以进入网络

☆短按多媒体键是开启设置好的程序,长按是重新设置程序

☆长按功能键,会打开有已开程序的菜单,如果想退出其中一个,直接可以按“C”键退出,就不用进入后再退出了

☆待机状态下长按#键转情景模式(无声)

☆长按住右软键能打开“声控命令”下的程序

☆摄象机盖滑下来自动解开键盘锁

☆待机时快速依次按左软件和*,可以锁键盘(这个就……)

☆头顶上的关机键,按一下可以调出情景模式选择菜单

Tags: , ,

作者:Jock

十一 03

提交页面:
<input type="text" name="price" value="xxx">
<input type="text" name="price" value="xxx">
<input type="text" name="price" value="xxx">
<input type="text" name="price" value="xxx">
<input type="text" name="price" value="xxx">

servlet提取值:
String priceValue[]=request.getParameterValues("price");

Tags:

作者:Jock

十一 02

☆一条信息,按住笔型键,再按删除C键,可以将短信复制到记事本(什么意思呢,就是在看信息的时候按住笔型键再按一下C字键,然后去记事本看一下,是不是已经存进去了……这样就可以放心看一条删一条了,这样别人打开收件箱向来没有短信,其实都在记事本里……哈哈哈哈,想跟我斗??……)

☆需要连续输入符号时,只须按*移动你想要输入的符号,按几下5键然后再按确定键,就可以了,(输无敌分隔线-------和一些表情比如^-^ -_-!!! 时很方便)

☆写完短信后按拨号键可以直接发送

☆长按住#就可以立刻转换为数字输入法

☆要输入哪个数字,可以不必切换输入法,直接长按那个数字就可以了,省的来回切换

☆按住笔形键加方向键上下左右实现文本编辑里的涂黑

☆中文输入方式下,输完拼音按*键就会出现声调,按一次换一个声调,这样找某些变态人名就方便多了

☆按一下0是空格,两下是数字0,三下是回车换行,(四下还是空格 0 回车 空格 0 回车 空格 0 回车 空格 0 回车 空格 0 回车,在下真变态……)

☆中文输入方式下,按一下1是。 2下是, 3下是? 4下是!(4个常用的足够了,5下之后的、等等,如果和在下一般变态的话,可以测验手速和评测N80的键盘……)

Tags: , ,

作者:Jock

Switch to our mobile site