|
1. 静态页面的乱码问题 文件的编码和浏览器要显示的编码不一致。 1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看; 2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容. <meta http-equiv="content-type" content="text/html; charset=GBK"> 3) 如果系统是英文XP,没装东亚字符集支持, 也会显示乱码. 2. JSP 页面的乱码问题 1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成ISO8859-1就不能保存汉字; 2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让浏览器来优先选择一种编码. 如果JSP乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能正确显示 3. 表单提交的乱码问题(Tomcat 特有) 1). POST 的乱码 a. 首先浏览器提交表单的编码是根据表单所在页面来决定的, 而不是根据提交后的 JSP 页面的编码来决定的. 把所有的页面的编码都设置成一样的,例如 GBK. b. 处理方式就是在获取参数之前设置编码: request.setCharacterEncoding("GBK"); c. 可以用过滤器的方式来解决, Tomcat 已经带了一个现成的: apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.java web.xml <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2) GET 方式的乱码 用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式. String username = request.getParameter("username"); System.out.println(username); // 转码, 先取得原始的二进制字节数组 byte[] data = username.getBytes("ISO8859-1"); // 根据新的字符集再构造新的字符串 username = new String(data, "GBK"); 小结: 所有的页面(除了最后的 GET 的乱码问题)都用统一的编码(GBK或者UTF-8), 就不会出现乱码问题. 4. 用过滤器来一次编码彻底解决表单参数的乱码问题 Tomcat 5/6 GBK 编码下完美解决中文表单问题的过滤器 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151848.html
分页的设计和编码, 代码下载请访问: 用 MyEclipse 开发的 Hibernate + JSP 分页代码(跳页错误已修正) 1. 当前页码的表单参数 listuser.do?page=2 同时转换成一个 int 类型的页码变量 int currentPage = Integer.parseInt( request.getParameter("page");// 当前页 2. 下一页 listuser.do?page=${currentPage+1} 上一页 listuser.do?page=${currentPage-1} 3. 一页显示多少数据 int pageSize = 5;//每页显示的数据数 4. 总页数 totalPage 1) 先从数据库取得总记录数 dao.UserDAO#getUserTotalCount() int totalCount = executeQuery("select count(*) from Users"); 2) 根据一页的数据类计算出总页数 dao.UserManager#getTotalPage(int pageSize) // 得到页面总数 int totalPageCount = ((totalCount + pageSize) - 1) / pageSize; if(totalPageCount == 0) { totalPageCount = 1; } 5. 从数据库里把第currentPage页的数据读取出来(Hibernate), DAO 层的代码 dao.UserDAO#findPagedAll(int currentPage, int pageSize) 两个参数: currentPage 当前页(从1开始的) pageSize 取多少数据 String queryString = "from User"; Query queryObject = getSession().createQuery(queryString); queryObject.setFirstResult((currentPage - 1) * pageSize); queryObject.setMaxResults(pageSize); List result = queryObject.list(); 6. 在前台显示上下页的链接,并根据总页数的上下限来避免让用户跳到第-1页或者比最大页数还大的页码哪里 <c:if test="${currentPage > 1}"> [ 上一页的链接 ] </c:if> <c:if test="${currentPage <= 1}"> [ 上一页的文本 ] </c:if> 7. 通过 forEach 来显示数据 <c:forEach items="${users}" var="user" > ${user.id} ${user.username} <c:/forEach> 8. 通过下拉菜单来跳转页面 转到 <script> // 页面跳转函数 // 参数: 包含网址的选择框(SELECT元素) function jumpPage(select) { var newUrl = "/hibernate_page/index.jsp?page=" + select.value; //alert(newUrl); document.location = newUrl; } </script> <!-- 输出 HTML SELECT 元素, 并选中当前页面编码 --> <select onchange='jumpPage(this);'> <option value="1" selected>1页</option> <option value="2" >2页</option> </select> 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151704.html
最近有同学做项目的时候发现 Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页, 上网搜了搜找到结果并测试成功, 只需要用下面的方法就能分页: /**
* 使用hql 语句进行操作
* @param hql HSQL 查询语句
* @param offset 开始取数据的下标
* @param length 读取数据记录数
* @return List 结果集
*/
public List getListForPage(final String hql, final int offset,
final int length) {
List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list = query.list();
return list;
}
});
return list;
} 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151702.html
常见的 Tomcat 5 表单编码提交后乱码的解决方案有很多, 有改 Tomcat Connector 属性的, 有加过滤器的. 但是 Tomcat 自带的那个过滤器只解决了 POST 方式的乱码却不能处理 GET 方式的乱码. 在这里那我就给出一个不需要修改任何 Tomcat 配置文件的完美解决中文问题的过滤器的代码: 首先是我们的测试页面: index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>表单测试页面</title>
</head>
<body>
<form action="action.jsp">
GET 方式: <input type=text name="name" value="GET 中文">
<input type=submit>
</form>
<form action="action.jsp" method="POST">
POST 方式: <input type=text name="name" value="POST 中文">
<input type=submit>
</form>
</body>
</html>
和普通的表单没有任何区别.
然后就是表单提交页面 action.jsp:
<%@ page language="java" pageEncoding="GBK"%>
<html>
<body>
参数: <%=request.getParameter("name") %> <br>
</body>
</html>
接着是过滤器的配置文件 web.xml (用 2.5 版本也可以):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>TomcatFormFilter</filter-name>
<filter-class>filters.TomcatFormFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TomcatFormFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
最后最关键的就是我们的过滤器代码了, 对 GET 方式使用请求包装器, 而 POST 方式则用 setCharacterEncoding():
package filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class TomcatFormFilter implements Filter {
/**
* Request.java
* 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest
* 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的
* request 对象即可.
*/
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
/**
* 转换由表单读取的数据的内码.
* 从 ISO 字符转到 GBK.
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 读取参数 -- 修正了中文问题.
*/
public String getParameter(String name)
{
return toChi(getHttpServletRequest().getParameter(name));
}
/**
* 读取参数列表 - 修正了中文问题.
*/
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("GBK");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
怎么样, 是不是很简单也很方便呢? 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151368.html
随着JPA得到众多厂商和开发人员的认同, 如同 Resin 的新闻中所说的那样: 2007-07-18 Resin 3.1.2 adds significant features Resin 3.1.2 now includes an implementation of the Java Persistence API, which is a major feature of the Enterprise Java Beans 3.0 standard. New features have also been added to the Hessian 2.0 web services protocol that allow for better security and message compression. Resin's JAX-WS support continues to improve with better support for WSDL handling and handler chains. Both Resin and the Quercus Java-PHP engine also underwent major reliability tests making them even more solid than before. "Before JPA, developers had to choose from an array of non-standard, incompatible API's to do object persistence. JPA standardizes this fundamental task and makes it easier for developers to get their applications written faster. Resin's JPA implementation is efficient and reliable, so our customers can start using this exciting new standard right away," said Emil Ong, Software Engineer at Caucho Technology. Resin 的最新版也开始支持内置的 JPA 了. 像上面这段话上所说, JPA 最大的优点就是把开发人员从各种各样的包和API中解放出来, 例如你的程序不再需要导入 org.hibernate.*** 或者 com.oracle.***, 而且便于随时切换底层引擎. 这就像 JDBC 所起的作用那样. PS: Resin 是另一款性能和易用性上都超过 Tomcat 的 Java Web 服务器, 同时也支持 Java 实现的 PHP. 虽然 Tomcat 是标准的实现, 但是 Resin 在很多地方都比 Tomcat 优秀. 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151360.html
| Project Name | Type | Lead | Version | Release Date | Download | Downloads | Hibernate 开发指南 | 原创 | Xiaxin(夏昕) | | | 92页, 530K | 131,158 | 《深入浅出Hibernate》 | 原创书籍 | Xiaxin(夏昕),Cao Xiaogang(曹晓钢),Jerry Tang(唐勇) | | | 随书示例, 7.5M | 190,908 | IBatis2 开发指南 | 原创 | Xiaxin(夏昕) | | | 48页,319K | 75,404 | Spring 开发指南 | 原创 | Xiaxin (夏昕) | | | 169页, 1.02M | 171,842 | Hibernate 手册 | 翻译 | Cao Xiaogang(曹晓钢) | 3.2 | | 238页,1.42M (PDF) HTML HTML_Single | 135,028 | Webwork2 开发指南 | 原创 | Xiaxin (夏昕) | | | 60页, 550K | 41,739 | 持续集成实践之CruiseControl | 原创 | mathaw | | | 34页, 964K | 19,690 | Shift To Dynamic(smalltalk) | 原创 | Raimundox(徐昊) | 0.3 | | 27页,1.98M | 15,561 | luntbuild手册 | 翻译 | melthaw | | | web site | 15,627 | Mapping Objects to Relational Databases | 翻译 | mochow(huhu) | | | 34页,571K | 25,175 | SpringFramework概述 | 翻译 | DigitalSonic | | | 24页,322K | 22,095 | Java网络程序员看Continuation
| 原创 | 刘畅 | | 2006/02/16 | 57页,1.45M | 90,087 | Hibernate Annotation Reference | 翻译 | melthaw | | | 进行中 已提交给hibernate小组,等待英文正式版本发布 | | Spring 2.0 Reference | 翻译 | DigitalSonic | 2.0 | 2006/10/22 | HTML, PDF(509页, 3.74M) ,CHM(2.2M) | 95,748(gro下载统计) | [OSGI Opendoc] | 原创 | Bluedavy | | | 90页,3M | 130,663 | Seam 2.0 Reference | 翻译 | Xiaogang Cao | 2.0 | | 进行中 | 架构风格与基于网络的软件架构设计(NEW!) | 翻译 | 原著:Roy Thomas Fielding博士,翻译:李锟、廖志刚、刘丹、杨光 | | 2007/6/28 | PDF(84页,810K) | 48,271 | Using the Rake Build Language(NEW!) | 翻译 | 原著:Martin Fowler,翻译:DigitalSonic | | 2007/6/1 | PDF(19页,333K) | 5,202 | OSWorkflow中文手册(NEW!) | 翻译 | 原作:OSWorkflow团队;翻译:陈刚 | 2.8 | 2007/8/21 | PDF(50页,790K) | 16,218 | | | | | | | 总计:1,230,416 | (备注:下载量统计到2007年10月8日1:20, 以apache log文件为准,未区分flashget等软件分段下载情况) 满江红站点还为以下开源软件软件/组织提供Hosting服务: 欢迎您的加入:我们可以为开源软件提供CVS/SVN/wiki/JIRA等服务.请email: caoxg at yahoo.com 联系. 目前管理员小组成员: 夏昕(nuke), 徐昊(Raimundox),mochow, 刘畅(liu chang),曹晓钢 | | 感谢同志们的无私奉献, 给广大初学者带来了福音. http://wiki.redsaga.com/confluence/display/RSTEAM/Home 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151237.html
摘要: http://hexapixel.com/projects/
http://hexapixel.com/ribbon/
下载地址: download the jar and the source
源码包里面的 com.hexapixel.widgets.ribbon.RibbonTester 展示了如何使用这个组件.
作者提示道: 可能有很多 b... 阅读全文文章来源: http://www.blogjava.net/beansoft/archive/2007/10/07/150887.html
第一部分: Struts 开发 6.83MB 22分36秒 http://beansoft.java-cn.org/download/ssh_1_struts.exe 第二部分: Hibernate + Spring 11.5MB 38分59秒 http://beansoft.java-cn.org/download/ssh_2_hibernate_spring.exe 第三部分: 自己实现 SpringProxyAction 5.05MB 14分25秒 http://beansoft.java-cn.org/download/ssh_3_struts_proxy_asm.exe 第四部分: ASM 错误解决及用 Spring 的代理实现整合 9.95MB 23分49秒 http://beansoft.java-cn.org/download/ssh_4_spring_struts.exe 大纲 PDF 下载: http://beansoft.java-cn.org/download/spring_struts_hibernate.pdf 427KB 代码下载(不带类库): http://beansoft.java-cn.org/download/myssh.rar 45KB 视频大纲: Java EE 讲座 MyEclipse 5.5 开发 Spring 整合 Struts, Hibernate 的应用 刘长炯 2007.10 本章要点 创建数据库 快速开发 Struts 应用 添加 Hibernate 功能 添加 Spring 功能 Spring 整合 Hibernate 模拟 Action 代理类实现 Struts + Spring Spring 整合 Struts Asm 出错和 log4j.properties 文件 测试运行 创建数据库 • 创建数据库 Ø 用 MyEclipse Derby 或者其它数据库 Ø 用 MyEclipse Database Explorer 管理数据库 Ø 执行 SQL: • CREATE TABLE bbsuser ( • id int(11) NOT NULL, • username varchar(200) NOT NULL, • password varchar(20) NOT NULL, • age int, • PRIMARY KEY (id) • ) • ENGINE=MyISAM DEFAULT CHARSET=GBK; 快速开发 Struts 应用 添加 Hibernate 功能 添加 Spring 功能 Spring 整合 Hibernate Spring 整合 Hibernate(续) 模拟 Action 代理类实现 Struts + Spring Spring 整合 Struts • 添加 Spring Plug in Ø <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> Ø <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" /> Ø </plug-in> • 替换 Action 的 Type Ø <action path="/login“ … Ø type="org.springframework.web.struts.DelegatingActionProxy" /> • 在 Spring 配置文件中配置 Bean Ø 要点: 通过 path 和 bean 的 name 进行匹配, 这两个值必须一样 Ø <bean name="/login" class="com.test.struts.action.LoginAction"></bean> • 注入 DAO 的代理 bean • 详细步骤参考文档 Spring 整合 Struts 的两种方式 • struts1加载spring的两种方式: 第一种:通过web.xml配置加载spring上下文环境,其配置方式如下: web.xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> 通过listener加载 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 或者利用severlet类加载 <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 第二种方式: 使用Struts插件 在struts-config.xml中 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/> </plug-in> • 这两种配置的明显区别就是,第一种方式可以配置多个spring配置文件。 Asm 出错和 log4j.properties 文件 • Log4j.properties Ø # Configure logging for testing: optionally with log file Ø log4j.rootLogger=WARN, stdout Ø # log4j.rootLogger=WARN, stdout, logfile Ø log4j.appender.stdout=org.apache.log4j.ConsoleAppender Ø log4j.appender.stdout.layout=org.apache.log4j.PatternLayout Ø log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n Ø log4j.appender.logfile=org.apache.log4j.FileAppender Ø log4j.appender.logfile.File=target/spring.log Ø log4j.appender.logfile.layout=org.apache.log4j.PatternLayout Ø log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n • 删除 asm-2.2.3.jar 测试运行 • 测试运行 Ø 用 MyEclipse 发布到 Tomcat Ø 运行 Ø 打开浏览器测试 本章小结 • 整合要点 • ASM出错的解决方案 • Q and A? 截图: PPT 视频: 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/07/150877.html
下载后导入项目到 MyEclipse , 然后修改数据库连接参数即可测试. 我这用的是 MySQL 数据库. 用 JSP 是因为 Hibernate 可以配合各种框架, 因此在代码里我已经尽量的把页面和后台的直接变量耦合分隔开了. hibernate_page.zip 433KB 部分代码显示: 相关 SQL: CREATE TABLE `user` (
`id` int(11) NOT NULL,
`username` varchar(200) NOT NULL,
`password` varchar(20) NOT NULL,
`age` int,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=GBK;
-- JDBC Driver Name: com.mysql.jdbc.Driver
-- JDBC Driver URL: jdbc:mysql://hostname/dbname?useUnicode=true&characterEncoding=GBK
insert into user values(1, '中文', 'beansoft', 1);
insert into user values(2, 'BeanSoft', 'beansoft', 2);
insert into user values(3, '张三', 'beansoft', 3);
insert into user values(4, '李四', 'beansoft', 4);
insert into user values(5, '王五', 'beansoft', 5);
insert into user values(6, '马六', 'beansoft', 6);
insert into user values(7, '黑七', 'beansoft', 7);
insert into user values(8, '腊八', 'beansoft', 8);
insert into user values(9, '陆九', 'beansoft', 9);
insert into user values(10, '茅十八', 'beansoft', 10);
前台 JSP 代码:
<%@ page language="java" import="manager.*,java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html;charset=GBK"%>
<%-- 我们使用 JSTL 来访问数据 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
// 以下代码为业务逻辑代码, 应该放在 Servlet 或者 Struts 的 Action 或者其它框架的业务代码部分, 这些代码和当前页面是独立的
// {{{
// 分析当前页码
String pageString=request.getParameter("page");
if(pageString == null || pageString.length() == 0) {
pageString = "1";
}
int currentPage= 0 ;
try {
currentPage = Integer.parseInt(pageString);// 当前页码
} catch(Exception e) {}
if(currentPage == 0) {
currentPage = 1;
}
int pageSize = 3;//每页显示的数据数
// 读取数据
UserManager manager = new UserManager();
List users = manager.findPagedAll(currentPage, pageSize);
request.setAttribute("users",users);// 保存用户列表
request.setAttribute("totalPage", manager.getTotalPage(pageSize));// 保存总页数
request.setAttribute("totalCount", manager.getUserTotalCount());// 保存记录总数
request.setAttribute("currentPage", currentPage);// 保存当前页码
// }}}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>用户列表页面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>用户列表<br>
<%-- 输出用户列表 --%>
总用户:${totalCount}个用户<br>
<table width="80%" border="0">
<tr>
<td><b>用户ID</b></td>
<td><b>用户名</b></td>
<td><b>操作</b></td>
</tr>
<c:forEach items="${users}" var="user" >
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td><a href="edit.jsp?id=${user.id}">修改</a></td>
</tr>
</c:forEach>
</table>
第${currentPage}页/共${totalPage}页
<%-- 输出页面跳转代码, 分链接和静态文字两种 --%>
<c:if test="${currentPage > 1}">
[ <a href="${pageContext.request.contextPath}/index.jsp?page=${currentPage-1}">上一页</a> ]
</c:if>
<c:if test="${currentPage <= 1}">
[ 上一页 ]
</c:if>
<c:if test="${currentPage < totalPage}">
[ <a href="${pageContext.request.contextPath}/index.jsp?page=${currentPage+1}">下一页</a> ]
</c:if>
<c:if test="${currentPage >= totalPage}">
[ 下一页 ]
</c:if>
<%-- 输出 JavaScript 跳转代码 --%>
转到
<script>
// 页面跳转函数
// 参数: 包含页码的选择框(SELECT元素)
function jumpPage(select) {
var newUrl = "${pageContext.request.contextPath}/index.jsp?page=" + select.value;
//alert(newUrl);
document.location = newUrl;
}
</script>
<!-- 输出 HTML SELECT 元素, 并选中当前页面编码 -->
<select onchange='jumpPage(this);'>
<c:forEach var="i" begin="1" end="${totalPage}">
<option value="${i}"
<c:if test="${currentPage == i}">
selected
</c:if>
>第${i}页</option>
</c:forEach>
</select>
</body>
</html>
后台 DAO:
package dao;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import util.HibernateSessionFactory;
/**
* Data access object (DAO) for domain model class User.
*
* @see dao.User
* @author MyEclipse Persistence Tools
*/
public class UserDAO {
private static final Log log = LogFactory.getLog(UserDAO.class);
// property constants
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String AGE = "age";
public Session getSession() {
return HibernateSessionFactory.getSession();
}
/**
* 得到用户总数
*
* @return 用户记录总数
*/
public int getUserTotalCount() {
Query q = getSession().createQuery("select count(*) from User");
List cc = q.list();
Integer a = (Integer) cc.get(0);
return a.intValue();
}
/**
* 分页显示用户数据.
*
* @param currentPage
* 当前页码, 从 1 开始
* @param pageSize
* 每页显示数据量
* @return 用户数据
*/
public List findPagedAll(int currentPage, int pageSize) {
log.debug("分页查找");
try {
if (currentPage == 0) {
currentPage = 1;
}
String queryString = "from User";
Query queryObject = getSession().createQuery(queryString);
queryObject.setFirstResult((currentPage - 1) * pageSize);
queryObject.setMaxResults(pageSize);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
public void save(User transientInstance) {
log.debug("saving User instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(User persistentInstance) {
log.debug("deleting User instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public User findById(java.lang.Integer id) {
log.debug("getting User instance with id: " + id);
try {
User instance = (User) getSession().get("dao.User", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public List findByExample(User instance) {
log.debug("finding User instance by example");
try {
List results = getSession().createCriteria("dao.User").add(
Example.create(instance)).list();
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
public List findByProperty(String propertyName, Object value) {
log.debug("finding User instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from User as model where model."
+ propertyName + "= ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, value);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}
public List findByUsername(Object username) {
return findByProperty(USERNAME, username);
}
public List findByPassword(Object password) {
return findByProperty(PASSWORD, password);
}
public List findByAge(Object age) {
return findByProperty(AGE, age);
}
public List findAll() {
log.debug("finding all User instances");
try {
String queryString = "from User";
Query queryObject = getSession().createQuery(queryString);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
public User merge(User detachedInstance) {
log.debug("merging User instance");
try {
User result = (User) getSession().merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
public void attachDirty(User instance) {
log.debug("attaching dirty User instance");
try {
getSession().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void attachClean(User instance) {
log.debug("attaching clean User instance");
try {
getSession().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
}
后台 Manager:
/**
*
*/
package manager;
import java.util.List;
/**
* 用户管理类
*
* @author Administrator
*
*/
public class UserManager {
/** 用户管理 DAO */
private dao.UserDAO userDAO = new dao.UserDAO();
/**
* 得到用户总数
* @return 用户记录总数
*/
public int getUserTotalCount(){
return userDAO.getUserTotalCount();
}
/**
* 获取总页面数.
*
* @param pageSize
* 一页显示数据量
* @return 页面总数
*/
public int getTotalPage(int pageSize) {
int totalCount = userDAO.getUserTotalCount();
// 得到页面总数
int totalPageCount = ((totalCount + pageSize) - 1) / pageSize;
return totalPageCount;
}
/**
* 分页显示用户数据.
* @param currentPage 当前页码, 从 1 开始
* @param pageSize 每页显示数据量
* @return 用户数据
*/
public List findPagedAll(int currentPage, int pageSize) {
return userDAO.findPagedAll(currentPage, pageSize);
}
}
文章来源: http://www.blogjava.net/beansoft/archive/2007/10/05/150583.html
视频内容: 1. 从 http://tomcat.apache.org/ 下载并安装 Tomcat 6 服务器 2. 在 MyEclipse 中配置服务器 3. 在 MyEclipse 中启动/停止 Tomcat 6 4. 新建 Web 项目 5. 新建静态页面并添加 GET 和 POST 表单 6. 创建 FormServlet 7. 编写代码将参数读取出来并输出 8. 发布并测试运行, 查看发布内容 9. 页面输出汉字内容乱码问题解决 + 如何重新发布 10. POST 方式表单参数乱码解决 11. GET 方式表单参数乱码解决 下载: http://beansoft.java-cn.org/download/MyEclipse6_6.exe 9.37 MB 27分06秒 相关代码: web.xml <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>FormServlet</servlet-name>
<servlet-class>servlet.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FormServlet</servlet-name>
<url-pattern>/FormServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>form.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GBK">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="./FormServlet" method="GET">
GET: <input name="username">
<input type="submit">
</form>
<form action="./FormServlet" method="POST">
POST: <input name="username">
<input type="submit">
</form>
</body>
</html>
FormServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public FormServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" 您输入的用户名是:");
// GET 方式, 编码转换
String username = request.getParameter("username");
username = new String(username.getBytes("ISO8859-1"), "GBK");
out.print(username);
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// POST 表单参数的乱码解决
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" 您输入的用户名是:");
out.print(request.getParameter("username"));
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}
文章来源: http://www.blogjava.net/beansoft/archive/2007/10/05/150563.html
|