1. На основе нашего общего New Home Page 1 блог на Servlet
пакет com.zking.web; импорт java.io.IOException; импорт java.util.List; импорт java.util.Map; импорт javax.servlet.Servlet; импорт javax.servlet.ServletException; импорт javax.servlet.annotation.WebServlet; импорт javax.servlet.http.HttpServlet; импорт javax.servlet.http.HttpServletRequest; импорт javax.servlet.http.HttpServletResponse; импорт com.zking.dao.BookDao; импорт com.zking.entity.Book; импорт com.zking.util.PageBean; / ** * Servlet класс реализации BookServet * / @WebServlet ( "/ BookServet") общественный класс BookServet расширяет HttpServlet реализует Servlet { частный статический окончательный долго serialVersionUID = 1L; частный BookDao bookDao = новый BookDao (); / ** * @see HttpServlet # HttpServlet () * / общественного BookServet () { супер (); // TODO Авто-конструктор генерируется окурок } / ** * @see HttpServlet # doGet (HttpServletRequest запрос, HttpServletResponse ответа) * / защищена недействительная doGet (HttpServletRequest запрос, HttpServletResponse ответа) броски ServletException, IOException { // TODO автоматической генерации метод заглушка doPost (запрос, ответ); } / ** * @see HttpServlet # doPost (HttpServletRequest запрос, HttpServletResponse ответ) * / Защищено недействительная doPost (HttpServletRequest запрос, HttpServletResponse ответ) бросает ServletException, IOException { // TODO автоматической генерации метод stubo e.printStackTrace (); Строка BNAME = request.getParameter ( "BNAME"); Книга книга = новая книга (); book.setBname (BNAME); PageBean бобов = новый PageBean (); попробуйте { bean.setRequest (запрос); Список <книга> список = this.bookDao.list (книга, бобовые); request.setAttribute ( "Booklist", список); request.setAttribute ( "pagebean", бобовые); request.getRequestDispatcher ( "/ book.jsp") вперед (запрос, ответ). } Задвижка (Исключение е) { // TODO автоматическая генерация улова блок } }
2. Преобразование PageBen
com.zking.util пакет; Импорт java.util.HashMap; Импорт java.util.Map; Импорт javax.servlet.http.HttpServletRequest; / ** * Инструменты вкладка * * / класс PageBean общественного { Private Page = INT 1. // страница частных ИНТ строк = 10; // размер страницы частное ИНТ всего = 0; // общее количество записей Private карте <String, String []> = новый новый PAMAP HashMap <String, String []> (); Private Строка URL ; общественная пустота SetRequest (запрос HttpServletRequest) { все параметры // сохранить запрос this.setPaMap (request.getParameterMap ()); this.setUrl (request.getRequestURL () ToString ().); // JSP - страницы в контролирует ли пагинация this.setPagination (request.getParameter ( "разбиение на страницы")); //在JSP页面控制一页展示多少条 this.setRows (request.getParameter ( "строк")); this.setPage (request.getParameter ( "страницы")); } Частная пустота setPage (String страница) { this.page = StringUtils.isNotBlank (страницы)? Integer.valueOf (страница): this.page; } Частная пустота setPagination (String пагинация) { this.pagination = StringUtils.isNotBlank (пагинация)? ! "ложный" .equals (пагинация): this.pagination; } Частной недействительная setRows (String строка) { this.rows = StringUtils.isNotBlank (строки)? Integer.valueOf (строки): this.rows; } Публичная Map <String, String []> Общественного недействительными setPaMap (карта <String, String []> paMap) { this.paMap = paMap; } Строка GetURL общественности () { возвращение URL; } Общественного недействительными setUrl (String URL) { this.url = URL; } Частное логическое разбиение на страницы = истина; //是否分页 общественного PageBean () { супер (); } Общественного ИНТ GetPage () { возвращение страницы; } Общественной недействительная setPage (интермедиат страница) { this.page = страница; } Общественного INT GetRows () { возвращают строки; } Общественной недействительная setRows (INT строк) { this.rows = строки; } Общественного ИНТ getTotal () { вернуться общее; } Общественного недействительный setTotal (интермедиат всего) { this.total = общее; } Общественного недействительными setTotal (строка всего) { this.total = Integer.parseInt (всего); } Общественного логический isPagination () { вернуть разбиение на страницы; } Общественного недействительный setPagination (логическое разбиение на страницах) { this.pagination = нумерация страниц; } / ** *获得起始记录的下标 * * @return * / общественного ИНТ getStartIndex () { возвращение (this.page - 1) * this.rows; } @Override общественного Строка ToString () { возвращение "PageBean [страница =" + страница + "строки =" + строк + "общая =" + общее + "разбиение на страницы =" } / ** * получить максимальное количество страниц * @return * / Общественного ИНТ getMaxPage () { вернуться this.total% this.rows == 0? this.total/this.rows: (this.total/this.rows) + 1; } / ** *获取下一页 * @return * / общественного ИНТ getNextPage () { вернуться this.page <this.getMaxPage ()? this.page + 1: this.page; } / ** *获取上一页 * @return * / общественного ИНТ getPreviousPage () { вернуться this.page> 1? this.page-1: this.page; } }
3 Создайте ярлык специальной страницы
3,1
Новые вспомогательные классы PageTag.java
пакет com.zking.tag; импорт java.io.IOException; импорт java.util.Map; импорт java.util.Map.Entry; импорт java.util.Set; импорт javax.servlet.jsp.JspException; импорт javax.servlet.jsp.JspWriter; импорт javax.servlet.jsp.tagext.BodyTagSupport; импорт com.zking.util.PageBean; общественный класс PageTag расширяет BodyTagSupport { личного PageBean боба; общественный PageBean getBean () { возвращение фасоль; } Общественная недействительная setBean (PageBean фасоль) { this.bean = боб; } @Override общественного INT doStartTag () бросает JspException { JspWriter из = pageContext.getOut (); пытаться { out.print (tohtml ()); } Поймать (IOException е) { // TODO автоматической генерации улов блок e.printStackTrace (); } Вернуть super.doStartTag (); } Частная строка tohtml () { StringBuilder С.Б. = новый StringBuilder (); //拼接下一次发送请求所要提交的隐藏的формы表单 sb.append ( "<форма ID = действие 'pageBeanForm' = '" + bean.getUrl () +' Метод = 'пост'>"); sb.append ( "<входной тип = 'скрытый' имя = 'страница'>"); Map <String, String []> paMap = bean.getPaMap (); если (paMap = NULL && paMap.size ()> 0) { Set <Вступление <String, String [] >> entrySet = paMap.entrySet (); для (Входа <String, String []> entrySet) { // Почему следует назначать его в покое? Так как последний запрос данные на первой странице, на следующей странице может быть второй, потому что эта страница до и после значения , соответствующего запросу не то же самое, чтобы присвоить отдельные если (! "страница" .equals (entry.getKey ())) { для (String Вэл: entry.getValue ()) { sb.append ( "<входной тип = имя 'скрытый' = '" + entry.getKey ( ) +»значение = '" + вал +'> "); } } } } Sb.append ( "</ форма>"); //拼接分页条 sb.append ( "<DIV стиль = 'выравнивания текста: справа; размер шрифта: 12px;'>"); sb.append ( "每页"+ bean.getRows () +"条,共"+ bean.getTotal () +"条,第"+ bean.getPage () +"页,共" + bean.getMaxPage () + "页<a href='javascript:gotoPage(1)'>首页"); sb.append ( "</a> <а"); getNextPage () + ")"> 下一页 </a> <а"); sb.append ( "HREF = 'JavaScript: GotoPage ( "+ bean.getMaxPage () +")'>尾页</a> <входной тип = 'Текст'"); sb.append ( "HREF = 'JavaScript: GotoPage ( "+ bean.getNextPage () +")'>下一页</a> <а"); sb.append ( "ID = 'skipPage'"); sb.append ( "стиль = 'выравнивания текста: центр; размер шрифта: 12px; ширина: 50px;'> <а"); sb.append ( "HREF = 'JavaScript: skipPage ()'> Go </a>"); sb.append ( "</ DIV>"); //拼接所需要的JS代码 sb.append ( "<скрипт типа = 'текст / JavaScript'>"); sb.append ( "функция GotoPage (страница) {"); sb.append ( "document.getElementById ( 'pageBeanForm') = page.value страница;"); sb.append ( "document.getElementById ( 'pageBeanForm') представляет ();" . ); sb.append ( "}"); sb.append ( "функция skipPage () {"); sb.append ( "вар страница = document.getElementById ( 'skipPage') значение;."); sb.append ( "если (страница || IsNaN (страница) || ParseInt (страница) <1 || ParseInt (страница)>! "+ bean.getMaxPage () +") {"); sb.append ( "возвращение;"); sb.append ( "}"); sb.append ( "GotoPage (страница);"); sb.append ( "}"); sb.append ( "</ скрипт>"); вернуть sb.toString (); } }
3.2 Создание файла TLD index.tld (помощник класса свойства-однозначное соответствие)
<тэг> <имя> страница </ имя> <тег-класс> com.zking.tag.PageTag </ тег-класс> <тело-контента> JSP </ тело содержание> <атрибут> <имя> боб </ имя> <требуется> True </ требуется> <rtexprvalue> True </ rtexprvalue> </ атрибут> </ тег>
4. от сделки EncodingFiter.java фильтра с китайской проблемой мусора
@WebFilter (urlPatterns = "/ *") с использованием servlet3.0 аннотацию технологии.
пакет com.zking.util; импорт java.io.IOException; импорт java.util.Iterator; импорт java.util.Map; импорт java.util.Set; импорт javax.servlet.Filter; импорт javax.servlet.FilterChain; импорт javax.servlet.FilterConfig; импорт javax.servlet.ServletException; импорт javax.servlet.ServletRequest; импорт javax.servlet.ServletResponse; импорт javax.servlet.annotation.WebFilter; импорт javax.servlet.http.HttpServletRequest; импорт javax.servlet.http.HttpServletResponse; / ** *中文乱码处理 * * / @WebFilter (urlPatterns = "/ *") общественный класс EncodingFiter реализует фильтр { частное кодирование String = "UTF-8"; //默认字符集 общественного EncodingFiter () { супер (); } Общественного недействительными уничтожить () { } общественного недействительными doFilter (запрос, ответ ServletRequest ServletResponse, FilterChain цепи) бросает IOException, ServletException { HttpServletRequest REQ = (HttpServletRequest) запроса; Ответ HttpServletResponse Рез = (HttpServletResponse); //中文处理必须放到chain.doFilter (запрос, ответ)方法前面 res.setContentType ( "текст / html; кодировка =" + this.encoding); если (req.getMethod () equalsIgnoreCase ( "пост").) { req.setCharacterEncoding (this.encoding); } Еще { карта Карта req.getParameterMap = (); // сохранить все имя параметра = значение параметра (массив) коллекция карт комплект комплект = map.keySet (); //取出所有参数名 итератора это = set.iterator (); в то время как (it.hasNext ()) { Имя = Строка (String) it.next (); String [] = значения (String []) в качестве map.get (имя); // извлекаемые значений параметров [Примечание: Этот параметр представляет собой массив] для (INT I = 0; I <values.length, я ++) { значения [I] = новый новый String (значения [I] , .getBytes ( "ISO-8859-1"), this.encoding); } } } chain.doFilter (запрос, ответ); } общественного недействительными инициализации (FilterConfig FilterConfig) бросает ServletException { Строка filterConfig.getInitParameter S = ( "кодирование"); // прочитать набор символов сконфигурировано web.xml файл , если (нуль = s && s.trim ( ) !!. равенства ( "")) { this.encoding s.trim = (); } } }
Новый тест JSP
<% @ Языка страницы = "Java" CONTENTTYPE = "текст / html; кодировка = UTF-8" pageEncoding = "UTF-8" %> <% @ страница isELIgnored = "ложь" %> <% @ TagLib префикс = "с "URI =" http://java.sun.com/jsp/jstl/core "%> <% @ TagLib префикс = "г"= URI "/ MyJSP" %> <DOCTYPE HTML PUBLIC!" - // W3C / / DTD HTML 4.01 Transitional // EN " "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <META HTTP-эквив = "Content-Type" содержание =" текст / html; кодировка = UTF-8" > <название> Вставить заголовок здесь </ title> </ HEAD> <BODY> <h2>小说目录</ h2> <br> <форма действия = "$ {pageContext.request.contextPath} / BookServet" Метод = "пост"> </ form> 书名: <входной тип = "текст" название = "BNAME"> <входной тип = "отправить" значение = "确定"> <таблица граница = ширина "1" = "100%"> <TR> <TD>编号</ TD> <TD>名称</ TD> <TD>价格</ TD> </ TR > <с: Foreach изделия = "$ {Booklist}" переменная = "B"> <TR> <TD> $ {b.bid} </ TD> <TD> $ {b.bname} </ TD> <TD > $ {b.price} </ TD> </ TR> </ с: Foreach> </ таблица> <г: страница фасоли = "$ {pagebean}"> </ г: страница> </ тело> </ HTML>
Результаты таковы
Все данные показывают
Нечеткие результаты запроса
Все запросы на вторую страницу данных
Последние данные
Это целая таблица одного общих эффектов пейджинговых
主要就是将上一次查询请求再发一次
String contextPath = req.getContextPath();//根目录
String url = req.getServletPath();//请求的地址
req.getRequestURL() //获取请求全路径
Map<String, String[]> parameterMap = req.getParameterMap();//获得请求中的所有参数
注1:不能将分页表单嵌套到其它表单中,否则不能提交表单!!!