web day20 单表练习之分页,java web监听器, 国际化

分页

什么是分页

例:

第N页/共M页 首页 上一页 1 2 3 4 5 6 7 8 9 10 下一页 尾页 口 go

分页的优点:只查询一页,不用查询所有页

分页数据

页面的数据都是由Servlet传递来的

Servlet:

1.当前页面页数:pageCode,pc(没有传递按默认第一页)

2.总页数:totalPages,tp(总记录数/每页记录数)

3.总记录数:totalRecored,tr(dao来获取,select count(*) fromt_customer)\

4.每页记录数:pageSize,ps

5.当前页的记录:beanList

6.url:保存/项目名,保存/Servlet路径,保存?后面的参数(既保留多条件查询的条件)

分页Bean的设计

页数据总要在各层之间来回的传递,这些分页数据封装到一个javabean中,

它就叫分页Bean,例如:PageBean

代码

public class PageBean<T> {
	private int pc;// 当前页码page code
//	private int tp;// 总页数total page
	private int tr;// 总记录数total record
	private int ps;// 每页记录数page size
	private List<T> beanList;// 当前页的记录

	private String url;//它就是url后的条件!

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public int getPc() {
		return pc;
	}

	public void setPc(int pc) {
		this.pc = pc;
	}

	/**
	 * 计算总页数
	 * @return
	 */
	public int getTp() {
		// 通过总记录数和每页记录数来计算总页数
		int tp = tr / ps;
		return tr%ps==0 ? tp : tp+1;
	}

//	public void setTp(int tp) {
//		this.tp = tp;
//	}

	public int getTr() {
		return tr;
	}

	public void setTr(int tr) {
		this.tr = tr;
	}

	public int getPs() {
		return ps;
	}

	public void setPs(int ps) {
		this.ps = ps;
	}

	public List<T> getBeanList() {
		return beanList;
	}

	public void setBeanList(List<T> beanList) {
		this.beanList = beanList;
	}
}

分页在各层中的处理

Servlet传递pc,设定ps

由dao层返回一个PageBean

保存到域中再由页面显示

图2

显示分页页码列表

1 2 3 4 5 [6] 7 8 9 10

↑最多显示多少个页码!定为10

↑当前页,在页码列表中的位置,定为6

↑只需要当前页码来定出来页码列表

↓定下来页码列表只需要两样数据

1.begin

2.end

10 11 12 13 14 [15] 16 17 18 19

需要使用pc来推算出begin和end

begin = pc – 5

end = pc + 4

公式:

*如果总页数<=10(列表长度),那么begin=1,end=总页数

*使用公式计算;begin=pc-5, end=pc + 4

*头溢出:当begin<1时,让begin=1

*尾溢出:当end>${tp}时,让end=${tp}

代码

...
JSP
<%--
给出分页的链接
 --%>
<center>
第${pb.pc }页/共${pb.tp }页

<a href="${pb.url }&pc=1">首页</a>
<c:if test="${pb.pc > 1 }">
<a href="${pb.url }&pc=${pb.pc-1}">上一页</a>
</c:if>

<%-- 计算begin、end --%>
<c:choose>
	<%-- 如果总页数不足10页,那么把所有的页数都显示出来! --%>
	<c:when test="${pb.tp <= 10 }">
		<c:set var="begin" value="1" />
		<c:set var="end" value="${pb.tp }" />
	</c:when>
	<c:otherwise>
		<%-- 当总页数>10时,通过公式计算出begin和end --%>
		<c:set var="begin" value="${pb.pc-5 }" />
		<c:set var="end" value="${pb.pc+4 }" />
		<%-- 头溢出 --%>
		<c:if test="${begin < 1 }">
			<c:set var="begin" value="1" />
			<c:set var="end" value="10" />
		</c:if>
		<%-- 尾溢出 --%>
		<c:if test="${end > pb.tp }">
			<c:set var="begin" value="${pb.tp - 9 }" />
			<c:set var="end" value="${pb.tp }" />
		</c:if>
	</c:otherwise>
</c:choose>
<%-- 循环遍历页码列表 --%>
<c:forEach var="i" begin="${begin }" end="${end }">
	<c:choose>
		<c:when test="${i eq pb.pc }">
			[${i }]
		</c:when>
		<c:otherwise>
			<a href="${pb.url }&pc=${i}">[${i }]</a>
		</c:otherwise>
	</c:choose>

</c:forEach>

<c:if test="${pb.pc < pb.tp }">
<a href="${pb.url }&pc=${pb.pc+1}">下一页</a>
</c:if>
<a href="${pb.url }&pc=${pb.tp}">尾页</a>
</center>
  </body>
</html>

在超链接中要保留参数

当使用多条件查询后,然后在点击第2 页时,这个第2页超链接没有条件了,

所以会丢失条件,所以我们需要在页面上的所有链接都要保留条件

要把条件以一个字符串的形式保存到PageBean的url中!这个任务交给Servlet

代码

web层相关

	public String findAll(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1. 获取页面传递的pc
		 * 2. 给定ps的值
		 * 3. 使用pc和ps调用service方法,得到PageBean,保存到request域
		 * 4. 转发到list.jsp
		 */
		int pc = getPc(request);//得到pc
		int ps = 10;//给定ps的值,第页10行记录
		PageBean<Customer> pb = customerService.findAll(pc, ps);//传递pc, ps给Service,得到PageBean

		// 设置url
		pb.setUrl(getUrl(request));

		request.setAttribute("pb", pb);//保存到request域中
		return "f:/list.jsp";//转发到list.jsp
	}

	/**
	 * 获取pc
	 * @param request
	 * @return
	 */
	private int getPc(HttpServletRequest request) {
		/*
		 * 1. 得到pc
		 *   如果pc参数不存在,说明pc=1
		 *   如果pc参数存在,需要转换成int类型即可
		 */
		String value = request.getParameter("pc");
		if(value == null || value.trim().isEmpty()) {
			return 1;
		}
		return Integer.parseInt(value);
	}

	public String query(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		System.out.println(getUrl(request));
		/*
		 * 0. 把条件封装到Customer对象中
		 * 1. 得到pc
		 * 2. 给定ps
		 * 3. 使用pc和ps,以及条件对象,调用service方法得到PageBean
		 * 4. 把PageBean保存到request域中
		 * 5. 转发到list.jsp
		 */
		// 获取查询条件
		Customer criteria = CommonUtils.toBean(request.getParameterMap(), Customer.class);

		/*
		 * 处理GET请求方式编码问题!
		 */
		criteria = encoding(criteria);

		int pc = getPc(request);//得到pc
		int ps = 10;//给定ps的值,第页10行记录
		PageBean<Customer> pb = customerService.query(criteria, pc, ps);

		// 得到url,保存到pb中
		pb.setUrl(getUrl(request));

		request.setAttribute("pb", pb);
		return "f:/list.jsp";
	}

	/**
	 * 处理四样
	 * @param criteria
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	private Customer encoding(Customer criteria) throws UnsupportedEncodingException {
		String cname = criteria.getCname();
		String gender = criteria.getGender();
		String cellphone = criteria.getCellphone();
		String email = criteria.getEmail();

		if(cname != null && !cname.trim().isEmpty()) {
			cname = new String(cname.getBytes("ISO-8859-1"), "utf-8");
			criteria.setCname(cname);
		}

		if(gender != null && !gender.trim().isEmpty()) {
			gender = new String(gender.getBytes("ISO-8859-1"), "utf-8");
			criteria.setGender(gender);
		}

		if(cellphone != null && !cellphone.trim().isEmpty()) {
			cellphone = new String(cellphone.getBytes("ISO-8859-1"), "utf-8");
			criteria.setCellphone(cellphone);
		}

		if(email != null && !email.trim().isEmpty()) {
			email = new String(email.getBytes("ISO-8859-1"), "utf-8");
			criteria.setEmail(email);
		}
		return criteria;
	}

	/**
	 * 截取url
	 *   /项目名/Servlet路径?参数字符串
	 * @param request
	 * @return
	 */
	private String getUrl(HttpServletRequest request) {
		String contextPath = request.getContextPath();//获取项目名
		String servletPath = request.getServletPath();//获取servletPath,即/CustomerServlet
		String queryString = request.getQueryString();//获取问号之后的参数部份

		//  判断参数部份中是否包含pc这个参数,如果包含,需要截取下去,不要这一部份。
		if(queryString.contains("&pc=")) {
			int index = queryString.lastIndexOf("&pc=");
			queryString = queryString.substring(0, index);
		}

		return contextPath + servletPath + "?" + queryString;
	}
}

dao层相关

	/**
	 * 查询所有
	 * @return
	 */
	public PageBean<Customer> findAll(int pc, int ps) {
		try {
			/*
			 * 1. 他都PageBean对象pb
			 * 2. 设置pb的pc和ps
			 * 3. 得到tr,设置给pb
			 * 4. 得到beanList,设置给pb
			 * 5. 返回pb
			 */
			PageBean<Customer> pb = new PageBean<Customer>();
			pb.setPc(pc);
			pb.setPs(ps);
			/*
			 * 得到tr
			 */
			String sql = "select count(*) from t_customer";
			Number num = (Number)qr.query(sql, new ScalarHandler());
			int tr = num.intValue();
			pb.setTr(tr);
			/*
			 * 得到beanList
			 */
			sql = "select * from t_customer order by cname limit ?,?";
			List<Customer> beanList = qr.query(sql,
					new BeanListHandler<Customer>(Customer.class),
					(pc-1)*ps, ps);
			pb.setBeanList(beanList);
			return pb;
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}
//多条件查询 带分页
	public PageBean<Customer> query(Customer criteria, int pc, int ps) {
		try {
			/*
			 * 1. 创建PageBean对象 
			 * 2. 设置已有的属性,pc和ps
			 * 3. 得到tr
			 * 4. 得到beanList
			 */
			/*
			 * 创建pb,设置已有属性
			 */
			PageBean<Customer> pb = new PageBean<Customer>();
			pb.setPc(pc);
			pb.setPs(ps);

			/*
			 * 得到tr
			 */

			/*
			 * 1. 给出一个sql语句前半部
			 */
			StringBuilder cntSql = new StringBuilder("select count(*) from t_customer");
			StringBuilder whereSql = new StringBuilder(" where 1=1");
			/*
			 * 2. 判断条件,完成向sql中追加where子句
			 */
			/*
			 * 3. 创建一个ArrayList,用来装载参数值
			 */
			List<Object> params = new ArrayList<Object>();
			String cname = criteria.getCname();
			if(cname != null && !cname.trim().isEmpty()) {
				whereSql.append(" and cname like ?");
				params.add("%" + cname + "%");
			}

			String gender = criteria.getGender();
			if(gender != null && !gender.trim().isEmpty()) {
				whereSql.append(" and gender=?");
				params.add(gender);
			}

			String cellphone = criteria.getCellphone();
			if(cellphone != null && !cellphone.trim().isEmpty()) {
				whereSql.append(" and cellphone like ?");
				params.add("%" + cellphone + "%");
			}

			String email = criteria.getEmail();
			if(email != null && !email.trim().isEmpty()) {
				whereSql.append(" and email like ?");
				params.add("%" + email + "%");
			}

			/*
			 * select count(*) .. + where子句
			 * 执行之
			 */
			Number num = (Number)qr.query(cntSql.append(whereSql).toString(),
					new ScalarHandler(), params.toArray());
			int tr = num.intValue();
			pb.setTr(tr);

			/*
			 * 得到beanList
			 */
			StringBuilder sql = new StringBuilder("select * from t_customer");
			// 我们查询beanList这一步,还需要给出limit子句
			StringBuilder limitSql = new StringBuilder(" limit ?,?");
			// params中需要给出limit后两个问号对应的值
			params.add((pc-1)*ps);
			params.add(ps);
			// 执行之
			List<Customer> beanList = qr.query(sql.append(whereSql).append(limitSql).toString(),
					new BeanListHandler<Customer>(Customer.class),
					params.toArray());
			pb.setBeanList(beanList);

			return pb;

		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

JavaWeb监听器

三大组件:Servlet/Listener/Filter

Listener:监听器

1.初次相见:AWT

2.二次相见:SAX

监听器:

它是一个接口,内容由我们来实现

它需要注册,例如注册在按钮上

监听器中的方法,会在特殊事件发生时被调用

观察者:

例:

事件源:小偷

事件:偷东西

监听器:警察

监听器中的方法:抓捕

JavaWeb中的监听器

事件源:三大域-ServletContext/HttpSession/ServletRequest

ServletContext

生命周期监听:ServletContextListener

方法:2个,一个在出生时调用,一个在死亡时调用

voidcontextInitialized(ServletContextEvent sce):创建SErvletcontext时

voidcontextDestroyed(ServletContextEvent sce):销毁Servletcontext时

属性监听:ServletContextAttributeListener

方法:3个,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

voidattributeAdded(ServletContextAttributeEvent event):添加属性时;

voidattributeReplaced(ServletContextAttributeEvent event):替换属性时

voidattributeRemoved(ServletContextAttributeEvent event):移除属性时

HttpSession

生命周期监听:HttpSessionListener,

两个方法,一个在出生时调用,一个在死亡时调用

voidsessionCreated(HttpSessionEvent se):创建session时

voidsessionDestroyed(HttpSessionEvent se):销毁session时

属性监听:HttpSessioniAttributeListener,

三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

voidattributeAdded(HttpSessionBindingEvent event):添加属性时;

voidattributeReplaced(HttpSessionBindingEvent event):替换属性时

voidattributeRemoved(HttpSessionBindingEvent event):移除属性时

ServletRequest

生命周期监听:ServletRequestListener,

两个方法,一个在出生时调用,一个在死亡时调用;

voidrequestInitialized(ServletRequestEvent sre):创建request时

voidrequestDestroyed(ServletRequestEvent sre):销毁request时

属性监听:ServletRequestAttributeListener,

三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

voidattributeAdded(ServletRequestAttributeEvent srae):添加属性时

voidattributeReplaced(ServletRequestAttributeEvent srae):替换属性时

voidattributeRemoved(ServletRequestAttributeEvent srae):移除属性时

javaWeb中完成编写监听器:

1.写一个监听器类:要求必须去实现某个监听器接口;

2.注册,是在web.xml中配置来完成注册

事件对象及方法

ServletContextEvent:

ServletContextgetServletContext()

HttpSessionEvent:

HttpSessiongetSession()

ServletRequest:

ServletContextgetServletContext();

ServletRequesgetServletRequest();

ServletContextAttributeEvent:

ServletContextgetServletContext();

StringgetName():获取属性名

ObjectgetValue():获取属性值

HttpSessionBindingEvent:同上/获取相应对象/属性名/属性值

ServletRequestAttributeEvent :同上/获取相应对象/属性名/属性值

感知监听(都与HttpSession相关)

区别:

它用来添加到JavaBean上,而不是添加到三大域上!

这两个监听器都不需要在web.xml中注册

HttpSessionBindingListener:添加到javabean上,javabean就知道自己是否添加到session中了。

HttpSessionActivationListener:Tomcat钝化/活化session时→保存到硬盘/从硬盘加载到内存,javabean可以感知到相关操作

钝化和活化

其实就是使用序列化和反序列化技术把session从内存保存到硬盘,和把session从硬盘加载到内存

如果javabean没有实现Serializable(序列化)接口,当session钝化时就不会钝化,

而是把Person从session中移除再钝化!这也说明session活化后,session中就不在有javabean对象了

国际化

什么是国际化:国际化就是可以把页面中的中文变成英文。

理解国际化:想把页面文字修改就不能硬编码 ,而是把相应文字编成变量

Locale类

newLocale(“zh”, “CN”);

newLocale(“en”, “US”);

一个Locale对象表示的就是语言和国家

ResourceBundle类

ReourceBundle类用来获取配置文件中的内容

ResourceBundle的getBundle()方法需要两个参数:

1.配置文件的基本名称

2.Locale

getBundle()方法会通过两个参数来锁定配置文件

页面国际化

NumberFormat

NumberFormat类用来对数字进行格式化:需要使用Stringformat(double)方法

DateFormat

DateFormat类用来对日期进行格式化:需要使用Stringformat(Date)方法

MessageFormat

MessageFormat可以把模式中的{N}使用参数来替换。我们把{N}称之为点位符。其中点位符中的N是从0开始的整数。

MessageFormat.format(String pattern, Object… params),其中pattern中可以包含0~n个点位符,而params表示对点位符的替换文本。注意,点位符需要从0开始。

时间: 2025-01-18 09:07:46

web day20 单表练习之分页,java web监听器, 国际化的相关文章

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

mybatis单表操作实现完全java代码封装

之前在项目中用到mybtis操作数据库时都是手动写sql,对于我这种sql水平不是很好地人来说痛苦死了:动态查询的sql我表示到现在还不会写呀! 还好,利用数据库表反向生成的工具可以帮我解决大部分的sql;(mybatis generator 你懂的) 首先利用反向生成可以帮我们自动生成实体类,dao接口,dao映射文件: 在dao映射文件如下所示: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE

这份Java Web必读书单,值得所有Java工程师一看!

点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,而目前市面上最流行的Java Web框架已然是Spring全家桶,从过去的Spring,SpringMVC,再到SpringBoot.而曾经流行的JSP和servlet,随着前后端分离的趋势,以及Spring这类框架的冲击,也逐渐地淡出了人们的视线,被历史所抛弃. 那么今天如果我们要学习Java Web,应该按照什么样的一个路线去学习

Java Web开发笔记(2016-5-6 11:13、2016-5-10 11:13、2016-5-12 14:58)

http://localhost:8080/EquipmentSys/equipment/findEquipStateByEquipmentNumber.html?DEVEICEID=04:e6:76:df:f0:94 返回 1,1 设备状态(1运营,2维护,3锁定),是否更新的开关IsUpdate={1,0}(游戏APK更新条件:IsUpdate=1而且版本号不一样) /** * 接口 * @param request * @return * @throws UnsupportedEncodi

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

Java WEB 安全认证

用户权限问题是绝大部分应用都要考虑的问题,在这些应用中想必都会定义role,user等来控制资源的访问.今天这里要说的并不是如何去设计权限的管理系统,而是来说明一下Web应用的安全域等. 在与Java web相关的JSR中,对于Java Web的安全访问有也相关规定,具体内容就不再这里阐述.与些相关的配置有:security-constraint,security-role,login-config. Web安全访问的机制其实就是一套权限处理系统.它包括了:role.user.resources

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Java web基础总结一之—— xml基础

Java web基础总结之一--xml基础 要学习java web,掌握xml语言是必要的,可以说,在一个java web项目中,xml配置文件无处不在.首先每个java web项目都会有一个web.xml的配置文件.而在各种各样的框架中,xml配置文件更是必不可少.当然,虽然有些框架可以使用注解来实现零配置.但是一般还是习惯于使用配置文件,可以和代码解耦和. 一.Xml基础知识以及语法规范 那首先的问题是,什么是xml?它主要用来做什么? Xml是Extensible Markup Langu