サーブレット上の私たちの共通の新ホームページ1ブログに基づき1
パッケージ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。 / ** *サーブレットの実装クラスBookServet * / @WebServlet( "/ BookServet") パブリッククラスBookServetが延びるのHttpServletは、サーブレット{実装します プライベート静的最終長い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( "ブックリスト"、リスト)。 request.setAttribute( "pagebean"、豆)。 request.getRequestDispatcher( "/ book.jsp")、前方(リクエスト、レスポンス)。 }キャッチ(例外e){ // TODO自動生成されたcatchブロック } }
2.変換PageBen
com.zking.utilパッケージ、 インポートのjava.util.HashMap; インポートjava.util.Map; インポートするjavax.servlet.http.HttpServletRequest; / ** * [ツール]タブ * * / パブリッククラスPageBean { プライベートページ= INT 1。 //ページ プライベートint型の列= 10; //ページサイズ プライベートint型0 =合計;レコード//総数 プライベート地図<文字列、文字列[]> =新しい新しいPAMAPのHashMap <文字列、文字列[]>(); プライベート文字列のURL ; 公共ボイドのSetRequest(HttpServletRequestのリクエスト){ すべてのパラメータ//を要求セーブ this.setPaMap(request.getParameterMap()); (。request.getRequestURL()のtoString())this.setUrlを; // JSPページへコントロールの改ページかどうか this.setPagination(request.getParameter( "改ページ")); //在JSP页面控制一页展示多少条 this.setRows(request.getParameter( "行")); this.setPage(request.getParameter( "ページ")); } プライベートボイドsetPageで(文字列のページ){ this.page = StringUtils.isNotBlank(ページ)?Integer.valueOf(ページ):this.page。 } プライベートボイドsetPagination(文字列の改ページ){ this.pagination = StringUtils.isNotBlank(ページ区切り)?! "偽" .equals(ページネーション):this.pagination。 } プライベートボイドsetRows(文字列){ this.rows = StringUtils.isNotBlank(行)?Integer.valueOf(行):this.rows。 } パブリックマップ<文字列、文字列[]> 公共ボイドsetPaMap(MAP <文字列、文字列[]> paMap){ this.paMap = paMap。 } パブリック文字列のgetURL(){ 戻り先URL。 } 公共ボイドてsetURL(文字列のURL){ this.url = URL。 } プライベートブールページネーション= TRUE; //是否分页 パブリックPageBean(){ スーパー()。 } 公共INT GETPAGE(){ 戻りページ。 } 公共ボイドsetPageで(INTページ){ this.page =ページ。 } 公共INT GETROWS(){ 戻り行。 } (行INT)公共ボイドsetRows { this.rowsの=行。 } 公共INT getTotal(){ 合計を返します。 } 公共ボイドsetTotal(INT合計){ this.total =総。 } 公共ボイドsetTotal(文字列の合計){ this.total = Integer.parseInt(合計)。 } パブリックブールisPagination(){ ページネーションを返します。 } 公共ボイドsetPagination(ブールページネーション){ this.pagination =ページネーション。 } / ** *获得起始记录的下标 * * @return * / パブリックINT getStartIndex(){ リターン(this.page - 1)* this.rows。 } @Override パブリック文字列のtoString(){ リターン"PageBean [ページ=" +ページ+ "行=" +行+ "合計=" + +合計"ページネーション=" } / ** *ページの最大数を取得 * @return * / 公共INT getMaxPage(){ this.total%this.rows == 0を返しますか?this.total/this.rows:(this.total/this.rows)+1; } / ** *获取下一页 * @return * / パブリックINT getNextPage(){ this.page <this.getMaxPage()を返しますか?this.page + 1:this.page。 } / ** *获取上一页 * @return * / パブリックINT getPreviousPage(){ > 1 this.pageを返しますか?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 Beanを 公共PageBean getBean(){ 戻りビーン。 } 公共ボイドsetBean(PageBean豆){ this.bean =ビーン。 } @Override 公共INTのdoStartTag()JspException {スロー )(のJspWriterアウト= pageContext.getOutと、 {試します out.print(tohtml())。 }キャッチ(IOExceptionを電子){ // TODO自動生成キャッチブロック e.printStackTrace(); } )(super.doStartTagを返します。 } プライベート文字列tohtml(){ StringBuilderのSB =新規のStringBuilder(); //拼接下一次发送请求所要提交的隐藏的形態表单 sb.append( "<フォームID = 'pageBeanForm'アクション= ' "+ bean.getUrl()+"'メソッド= 'ポスト'>"); sb.append( "の<input type = 'hidden'が名= 'ページ'>"); 地図<文字列、文字列[]> paMap = bean.getPaMap()。 (!paMap = NULL && paMap.size()> 0){もし セットの<entry <文字列、文字列[] >>のentrySet = paMap.entrySet()。 (エントリーの<文字列、文字列[]> entrySet){ //なぜ一人でそれを割り当てる必要がありますか?最後の要求は、1ページ目のデータであるため、要求に対応する値は、別個に割り当てること、同じではなく前後に、次のページは、このページから、第二の可能性が (もし! "ページ" .equals(entry.getKey())){ のために(文字列のval:entry.getValue()){ sb.append( "の<input type = 'hidden'が名= '" + entry.getKey( )+ "」値= ' "+ヴァル+"'>"); } } } } sb.append( "</フォーム>"); //拼接分页条 sb.append( "<divのスタイル= 'テキスト整列:右;フォントサイズ:12ピクセル;'>"); sb.append( "每页"+ bean.getRows()+"条、共"+ bean.getTotal()+"条、第"+ bean.getPage()+"页、共" + bean.getMaxPage() + "页<a href='javascript:gotoPage(1)'>首页"); sb.append( "</a>の<A")。 sb.append(」HREF = 'javascriptの:gotoPage( "+豆。getNextPage()+ "')>下一页</a>の<A"); sb.append( "HREF = 'javascriptの:gotoPage( "+ bean.getMaxPage()+")'>尾页</a>の<INPUT TYPE = 'テキスト'")。 sb.append( "ID = 'skipPage'")。 sb.append( "スタイル= 'テキスト整列:センター;フォントサイズ:12ピクセル、幅は50px;'> <A")。 sb.append( "HREF = 'javascriptの:skipPageは()'> </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( "VARページ=のdocument.getElementById( 'skipPage')値;。"); sb.append( "もし(ページ||ますisNaN(ページ)||のparseInt(ページ)<1つの||のparseInt(ページ)>! "+ bean.getMaxPage()+"){"); sb.append( "返します;"); sb.append( "}"); sb.append( "gotoPage(ページ);"); sb.append( "}"); sb.append( "</ SCRIPT>"); sb.toStringを返します(); } }
3.2作成TLDファイルindex.tld(プロパティ-1対応のクラスにアシスタント)
<タグ> <名前>ページ</名前> <タグ・クラス> com.zking.tag.PageTag </タグ・クラス> <ボディ・コンテンツ> JSP </ボディ・コンテンツ> <属性> <名前>豆</名前> <必要>真</>必要 <rtexprvalue>真</ rtexprvalue> </属性> </タグ>
中国のゴミ問題4.オフフィルターEncodingFiter.java契約
servlet3.0注釈技術を使用して@WebFilter(urlPatterns = "/ *")。
パッケージ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は{フィルタを実装 プライベート文字列のエンコード= "UTF-8"; //默认字符集 パブリックEncodingFiter(){ スーパー()。 } 公共ボイドは(){破壊 } 公共ボイドのdoFilter(のServletRequest要求たServletResponse応答 れるFilterChain鎖)にIOException、ServletExceptionが{スロー のHttpServletRequest REQ =(HttpServletRequestの)要求を、 HttpServletResponseのRES =(HttpServletResponseの)応答。 //中文处理必须放到chain.doFilter(リクエスト、レスポンス)方法前面 するres.setContentType( "テキスト/ HTML;のcharset =" + this.encoding)。 IF(。req.getMethod()equalsIgnoreCase( "POST")){ req.setCharacterEncoding(this.encoding)。 }他{ 地図マップreq.getParameterMap =(); //すべてのパラメータ名=パラメータ値を保存する(アレイ)地図コレクション = map.keySet(設定セット); //取出所有参数名 が(set.iteratorを=反復子)。 一方、(it.hasNext()){ 名前=文字列(String)をit.next(); map.get(名)などのString []の値=(文字列[]); //抽出されたパラメータ値:[注このパラメータは配列である] (I 0 = int型のために、私はvalues.lengthを<; Iは++){ 値[I] =新しい新しい文字列(値[I] .getBytes( "ISO-8859-1")、 this.encoding); } } } chain.doFilter(リクエスト、レスポンス)。 } 公共ボイドのinit(に、FilterConfigに、FilterConfig)はServletExceptionが{スロー 列filterConfig.getInitParameter S =( "エンコードを"); //は、web.xmlファイルを構成キャラクタ・セット読み取り (ヌル= S && s.trim(IF )を!!。 等号( "")){ this.encoding s.trim =(); } } }
新しいテストのjsp
<%ページ言語@ = "javaの" contentTypeの= "text / htmlの;のcharset = UTF-8" pageEncodingは= "UTF-8" %> <%@ページisELIgnored = "false"に%> <%@ taglibの接頭辞= "C "URI =" http://java.sun.com/jsp/jstl/core "%> <%@ taglibの接頭辞= "Z"のuri = "/ MyJSP" %> <DOCTYPE用HTML PUBLIC!" - // W3C / / DTD HTML 4.01移行// EN " "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <META HTTP-当量= "Content-Typeの"コンテンツ="テキスト/ HTML;のcharset = UTF-8" > <タイトル>ここで挿入タイトル</ TITLE> </ HEAD> <BODY> <H2>小说目录</ H2> <BR> <フォームアクション= "$ {pageContext.request.contextPath} / BookServet" METHOD = "POST"> 书名:の<input type = "text"の名= "BNAME">の<input type = "送信" 値= "确定"> </フォーム> <テーブル境界= "1"幅= "100%"> <TR> <TD>编号</ TD> <TD>名称</ TD> <TD>价格</ TD> </ TR > <C:のforeachアイテム= "$ {ブックリスト}" VAR = "B"> <TR> <TD> $ {b.bid} </ TD> <TD> $ {b.bname} </ TD> <TD > $ {b.price} </ TD> </ TR> </ C:forEachの> </ TABLE> <Z:ページBean = "$ {pagebean}"> </ Z:ページ> </ body> </ HTML>
結果は以下の通りであります
すべてのデータショー
ファジィクエリ結果
すべてのデータの2ページ目を問い合わせます
最終データ
これは、単一の一般的なページング効果の全体のテーブルです
主要就是将上一次查询请求再发一次
String contextPath = req.getContextPath();//根目录
String url = req.getServletPath();//请求的地址
req.getRequestURL() //获取请求全路径
Map<String, String[]> parameterMap = req.getParameterMap();//获得请求中的所有参数
注1:不能将分页表单嵌套到其它表单中,否则不能提交表单!!!