六 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:
Struts,
技巧,
示例 作者: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:
mysql,
技巧 作者:堕落天使
一 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:
jsp,
技巧,
源码 作者:堕落天使
十二 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:
N80,
nokia,
技巧 作者: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:
N80,
nokia,
技巧 作者:Jock
近期评论