zoukankan      html  css  js  c++  java
  • JAVA EE JSP collection

    http://guoqinhua1986-126-com.iteye.com/blog/231244

    ********************解决乱码问题(格式化)***********
    //格式化---转换为GBK
    public String fs(String str) {
    try {
    byte[] st = str.getBytes();
    str = new String(st, "GBK");
    } catch (UnsupportedEncodingException ex) {
    ex.printStackTrace();
    } // new java.util.Date(); -->java.sql.Date()
    return str.trim();
    }
    //格式化---转换为ISO-8859-1
    public String fg(String str) {
    try {
    byte[] st = str.getBytes("ISO-8859-1");
    str = new String(st);
    } catch (Exception ex) {
    ex.pr

    ********************jsp+javascript打造级连菜单***********
    <%@ page import="java.util.Date,yava.fileapp.*,java.sql.*;"
    contentType="text/html;charset=GB2312" pageEncoding="GB2312"
    %>
    <style>
    .f9{ font-size:9pt; }
    .bgc{ background-color:#AECAF9; color: #0033FF }
    .buttons{font-family:Arial; font-size:13px; font-weight:bold; background-color:#6796E4; color:white; border-top: solid 2px #AACAFB;
    border-bottom: solid 1px #4E7DC1;
    border-left: solid 1px #AECAF9;
    border-right: solid 1px #5679BD;
    padding:1px;
    margin:0px;}
    </style>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function rv()
    {
    var val="";
    for(i=0;i<combo_box.list2.length;i++){
    val+=","+combo_box.list2[i].value;
    }
    if(val.charAt(0)==","){
    val=val.substr(1,val.length);
    }
    opener.form1.frecname.value=val;
    self.close();
    }
    //-->
    </SCRIPT>
    <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
    <jsp:useBean id="user" scope="session" class="yava.fileapp.UserBean" />
    <%
    CDataSource ds=new CDataSource(); //数据联结Bean实例
    java.sql.Connection conn=ds.getConnection();
    java.sql.Statement stmt=null;
    java.sql.ResultSet rs=null;
    CDataCheck dc=new CDataCheck();
    %>
    <%
    String sqlu="SELECT t1.fno, t1.fname, t2.fname AS fdept FROM tuser t1 LEFT OUTER JOIN TDept t2 ON t1.fdept = t2.fno order by t2.fname";
    stmt=conn.createStatement();
    rs=stmt.executeQuery(sqlu);
    %>
    <script language="Javascript">
    arr = new Array();
    <% int temp=0;
    while(rs.next())
    {
    %>
    arr[<%=temp%>]=new Array("<%=rs.getString("fname")%>","<%=rs.getString("fdept")%>");
    <%
    temp = temp + 1;
    }
    %>
    temp=<%=temp%>;
    function ChangeLocation(id){
    document.combo_box.city.length=0; //初始化第2级菜单的长度,下标从0开始
    var i = 0;
    document.combo_box.city.options[0]=new Option("-------","");
    for(i=0;i<temp;i++){
    if(arr[i][1]==id){//如果相等,证明在第2级里面有输入第1级组织的子集,arr[总数目][部门]
    document.combo_box.city.options[document.combo_box.city.length] = new Option(arr[i][0], arr[i][0]);
    }
    }
    }
    </script>

    <form name="combo_box">
    <table border="0" cellspacing="0" cellpadding="0" height="210" width="59">
    <tr height="24">
    <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>部门选择</font></td>
    <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>人名选择</font></td>
    <td bgcolor="#336699" class="buttons" align=center nowrap><font color=#ffffff>添加/移除</font></td>
    <td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>最终人</font></td>
    </tr>
    <tr>
    <td>
    <select multiple id=prov name="prov" οnchange="ChangeLocation(combo_box.prov.options[combo_box.prov.selectedIndex].text);" style="150;height:200" class="bgc">
    <option value="0">请选择部门 ---></option>
    <%
    String sqld="SELECT * FROM tdept";
    stmt=conn.createStatement();
    rs=stmt.executeQuery(sqld);
    while(rs.next())
    {
    %>
    <option name="<%=rs.getString("fno")%>"><%=rs.getString("fname")%></option>
    <%
    }
    %>
    </select>
    </td>
    <td>
    <select multiple id=city style="150;height:200" class="bgc">
    </select>
    </td>
    <td nowrap align="center" class="bgc">
    <input type="button" onClick="move(this.form.list2,this.form.city)" value="<<" class="buttons">
    <input type="button" onClick="move(this.form.city,this.form.list2)" value=">>" class="buttons">
    </td>
    <td>
    <select multiple size="10" name="list2" style="150;height:200" class="bgc">
    </select>
    </td>
    </tr>
    <tr class="bgc">
    <td colspan="4" align="center"><input type="button" name="button1" class="buttons" value="选好了!" οnclick="rv();"></td>
    </tr>
    </table>
    </form>
    <script language="JavaScript">
    //人名移动
    function move(fbox, tbox) {
    var arrFbox = new Array();
    var arrTbox = new Array();
    var arrLookup = new Array();
    var i;
    for (i = 0; i < tbox.options.length; i++) {
    arrLookup[tbox.options[i].text] = tbox.options[i].value;
    arrTbox[i] = tbox.options[i].text;
    }
    var fLength = 0;
    var tLength = arrTbox.length;
    for(i = 0; i < fbox.options.length; i++) {
    arrLookup[fbox.options[i].text] = fbox.options[i].value;
    if (fbox.options[i].selected && fbox.options[i].value != "") {
    arrTbox[tLength] = fbox.options[i].text;
    tLength++;
    }
    else {
    arrFbox[fLength] = fbox.options[i].text;
    fLength++;
    }
    }
    arrFbox.sort();
    arrTbox.sort();
    fbox.length = 0;
    tbox.length = 0;
    var c;
    for(c = 0; c < arrFbox.length; c++) {
    var no = new Option();
    no.value = arrLookup[arrFbox[c]];
    no.text = arrFbox[c];
    fbox[c] = no;
    }
    for(c = 0; c < arrTbox.length; c++) {
    var no = new Option();
    no.value = arrLookup[arrTbox[c]];
    no.text = arrTbox[c];
    tbox[c] = no;
    }
    }
    </script>
    </body>

    ********************jsp实现图形验证码***********

    调用方法
    <img src="http://...../getImg">

    原理,在servlet中随机生成一个4位数字1000-9999
    然后把这数字写入session
    输出一个图片,上面写有这四个数字
    在服务器端根据用户输入的数字和
    session中的值比较。


    package com.schoolwx.util;
    import java.io.*;
    import java.util.*;
    import com.sun.image.codec.jpeg.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.awt.*;
    import java.awt.image.*;
    /**
    * Title: getImg.java
    * Description: 这个class主要实现随机生成一个4位数的验证码,并写入session,
    * Copyright: Copyright (c) 2003
    * Company: 蓝星软件
    * @author falcon
    * @version 1.1
    */
    public class getImg extends HttpServlet {
    private Font mFont=new Font("宋体", Font.PLAIN,12);//设置字体
    //处理post
    public void doPost(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException {
    doGet(request,response);
    }
    public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException {
    //取得一个1000-9999的随机数
    String s="";
    int intCount=0;
    intCount=(new Random()).nextInt(9999);//
    if(intCount<1000)intCount+=1000;
    s=intCount+"";
    //对session付值。
    HttpSession session=request.getSession (true);
    session.setAttribute("getImg",s);
    response.setContentType("image/gif");
    ServletOutputStream out=response.getOutputStream();
    BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
    Graphics gra=image.getGraphics();
    //设置背景色
    gra.setColor(Color.yellow);
    gra.fillRect(1,1,33,12);
    //设置字体色
    gra.setColor(Color.black);
    gra.setFont(mFont);
    //输出数字
    char c;
    for(int i=0;i<4;i++) {
    c=s.charAt(i);
    gra.drawString(c+"",i*7+4,11); //7为宽度,11为上下高度位置
    }
    JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image);
    out.close();
    }
    }

    ********************JSP调用报表示例***********

    <%@ page language="java" pageEncoding="GBK"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
    request.setCharacterEncoding( "GBK" );
    %>
    <%@taglib uri="/WEB-INF/runqianReport4.tld" prefix="report" %>
    <!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">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="<%=basePath%>/styles/css1.css" rel="stylesheet" type="text/css">

    <%
    String hong="hong=select * from ukehu where yid =""+request.getParameter("name")+""";

    %>
    </head>

    <body>
    <center>
    <report:html name="report1" reportFileName="红参数.raq"
    srcType="file"
    params="<%=hong%>"

    scale="1"
    width="-1"
    funcBarLocation="bottom"
    separator=" "

    needSaveAsExcel="yes"
    needSaveAsPdf="yes"
    needSaveAsWord="yes"
    needPrint="yes"

    printLabel="<input name="print_btn" type="button" class="btn001" value="print">"
    savePrintSetup="yes"
    printedRaq="红参数.raq"

    excelLabel="<input name="exportExcel_btn" type="button" class="btn001" value="To Excel">"
    pdfLabel="<input name="exportPdf_btn" type="button" class="btn001" value="To PDF">"
    wordLabel="<input name="exportWrod_btn" type="button" class="btn001" value="To Word">"
    saveAsName="userlist"

    needScroll="no"
    needPageMark="yes"
    firstPageLabel="<input name="firstPage_btn" type="button" class="btn001" value="第一页 ">"
    prevPageLabel="<input name="prevPage_btn" type="button" class="btn001" value="上一页">"
    nextPageLabel="<input name="nextPage_btn" type="button" class="btn001" value="下一页">"
    lastPageLabel="<input name="lastPage_btn" type="button" class="btn001" value="尾页">"
    displayNoLinkPageMark="yes"

    />
    </center>
    </body>
    </html>

    ********************JSP分页***********

    一 前提
    希望最新的纪录在开头给你的表建立查询:
    表:mytable
    查询:create or replace view as mytable_view from mytable order by id desc 其中,最好使用序列号create sequence mytable_sequence 来自动增加你的纪录id号
    二 源程序
    <%String sConn="你的连接"
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection(sConn,"你的用户名","密码");
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    Statement stmtcount=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rs=stmt.executeQuery("select * from mytable_view");
    String sqlcount="select count(*) from mytable_view";
    ResultSet rscount=stmtcount.executeQuery(sqlcount);
    int pageSize=你的每页显示纪录数;
    int rowCount=0; //总的记录数
    while (rscount
    int pageCount; //总的页数
    int currPage; //当前页数
    String strPage;
    strPage=request.getParameter("page");
    if (strPage==null){
    currPage=1;
    }
    else{
    currPage=Integer.parseInt(strPage);
    if (currPage<1) currPage=1;
    }
    pageCount=(rowCount+pageSize-1)/pageSize;
    if (currPage>pageCount) currPage=pageCount;
    int thepage=(currPage-1)*pageSize;
    int n=0;
    rs.absolute(thepage+1);
    while (n<(pageSize)&&!rs
    %>
    <%rs.close();
    rscount.close();
    stmt.close();
    stmtcount.close();
    conn.close();
    %>
    //下面是 第几页等
    <form name="sinfo" method="post" action="sbinfo_index.jsp?condition=<%=condition%>&type=<%=type%>" onSubmit="return testform(this)">
    第<%=currPage%>页 共<%=pageCount%>页 共<%=rowCount%>条
    <%if(currPage>1){%><a href="sbinfo_index.jsp?condition=<%=condition%>&type=& lt;%=type%>">首页</a><%}%>
    <%if(currPage>1){%><a href="sbinfo_index.jsp?page=<%=currPage-1%>&condition=& lt;%=condition%>&type=<%=type%>">上一页</a><%}%& gt;
    <%if(currPage<pageCount){%><a href="sbinfo_index.jsp?page=<%=currPage+1%>&condition=& lt;%=condition%>&type=<%=type%>">下一页</a><%}%& gt;
    <%if(pageCount>1){%><a href="sbinfo_index.jsp?page=<%=pageCount%>&condition=& lt;%=condition%>&type=<%=type%>">尾页</a><%}%>
    跳到<input type="text" name="page" size="4" style="font-size:9px">页
    <input type="submit" name="submit" size="4" value="GO" style="font-size:9px">

    </form>

    ********************JSP中表单数据存储的一种通用方法***********

    摘 要
      本文以Oracle数据库为例,介绍了在采用JSP技术开发WEB应用时一种简便通用的表单数据存储处理方法,以减轻开发工作量,同时提供了主要的程序代码。
      引言
      J2EE(Java 2 Enterprise Edition)技术已广泛应用在Web应用开发中,其中的JavaBean、Servlet技术为开发者提供了更为清晰的开发环境,使用JSP技术表现 页面,使用Servlet技术完成大量的业务处理,使用Bean来存储数据及一些业务处理。在WEB应用中,业务数据存储到数据库中的处理工作经常很繁 重,其中一种主要的形式就是表单数据存储到数据库,整个应用处理过程牵涉到大量的这种数据存储操作,对每个表单都要单独编写相应的数据存储程序,花费了开 发人员大量的时间和精力。采用什么方法来减轻表单数据存储的开发工作量是值得研究的问题。
      两种常见的表单数据存储处理方法
      1、对每一表单都编写相应的程序代码
      在JSP页面或JavaBean或Servlet中,使用request. getparameter()函数逐一提取表单提交的数据,或编写相应的JavaBean,使用setProperty方法将数据自动取到 JavaBean中,然后生成SQL语句(insert,update,delete),最后执行executeupdate()函数完成数据表存储。
      2、对每一数据表自动生成一个JavaBean程序代码
      数据库系统必须支持用户能够读取表结构,并识别关键字段。利用面向对象快速开发工具,如PowerBuilder、Delphi等,自行开发 一个java代码自动生成程序。在该程序中读取数据库表的结构:字段名、数据类型、数据长度,自动生成一个JavaBean代码。在该代码中定义与表中字 段对应的同名变量,建立所有变量的setValue和getValue方法,建立insert、update、delete函数分别处理insert、 update、delete的SQL语句生成和执行。
      在表单提交的数据处理页面中,编写如下代码,将表单数据存储到JavaBean中:
    <jsp:useBean id="table" class="table1_bean" />
    <jsp:setProperty name="table" property="*" />
    (注:table1_bean为上述自动生成的对应某一个表的JavaBean)
    然后调用table1_bean中insert、update、delete函数完成数据表存储,并返回执行结果。如:
    <%boolean success =table.insert(); %>
      第一种方法简单直观,但对每一表单都需要编写相应的数据处理程序。对稍微大一点的应用,表单数量可能很多,开发工作量很大,开发工作效率低。表结构变动如增加、减少字段时,需修改相应的数据处理程序。
      第二种方法相对第一种简便得多,每一数据表的数据处理由对应的JavaBean实现,JavaBean自动生成,不需编写,表结构变动时只需 重新生成新的JavaBean,经java编译后覆盖原java类即可。但该方法需要开发JavaBean自动生成程序,表结构变动时JavaBean需 要重新生成和编译。
      介绍一种简便通用的方法实现表单数据存储
      在WEB应用开发中,很多表单在经过前台浏览器端简单的数据校验后,提交后台服务器,服务器对数据不用作任何处理直接将数据存储到一个数据表 中。对这种情况,我们可以只编写一个程序,对这些表单统一处理,将数据存储到相应的一个数据表中。该方法同样要求数据库系统支持表结构读取和关键字段识 别。我们采用JSP技术编写该程序,程序文件取名为DbdataStore.jsp。
      1、调用格式
      在网页中表单的Action调用方法如下:
    <Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…">
      table1为数据将要存储的数据库表的表名,OperType操作类型分为三种:insert,update,delete。
    表单中的<input type=text name=…>,<textarea name=…><select name=…>等中的name值应与数据表的字段名相同,DBdataStore.jsp中逐一提取表单提交的对应字段名的数据值,若表单中未定义输入, 得到的值为空值,则对该字段不作处理。
      2、以oracle为例的视图定义
      1) 建立表各列数据类型视图
    CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name,column_name,data_type,data_length,data_precision,data_scale,column_id
    FROM all_tab_columns WHERE owner="user1";//user1为数据表的属主。
      2) 建立表的关键列视图
    CREATE OR REPLACE VIEW v_pkey_column AS
     SELECT b.table_name,b.column_name,b.position
     FROM all_constraints a,all_cons_columns b
     WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner="user1"  AND a.constraint_type="P";
      3、主要程序代码
      1) 程序初始化
    String tablename=request.getParameter("tablename");//提取表名
    String OperType=request.getParameter("OperType");//提取操作类型
    String sFieldValue="";//存放表单提交的字段数据值
    String fieldname="",Datatype="" //存放字段名,字段数据类型
    int iFieldvalue=0;
    String updateSql="",whereSql=" where ",insSql1="",insSql2="",opSql="",strSql ="";
    ResultSet rs1=null,rs2=null;
    insSql1="insert into "+tablename+" (";
    insSql2="values(";
      2)生成sql语句关键字段部分
      生成insert语句关键字段部分,如:insert into table1(id 和 values(100));
      只使用关键字段生成update,delete语句where部分,如:where id=100;
      在操作类型为update时,网页form表单中不对关键字段的数据进行修改。
    rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name=""+tablename+""");//取关键字段字段名
    while(rs1.next()){
     fieldname=rs1.getString("column_name");
     rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE  table_name=""+tablename+"" AND column_name=""+fieldname+""");//取关键字段数据类型
     if(rs2.next()){
      Datatype=rs2.getString("data_type");
      sFieldValue=request.getParameter(fieldname.toLowerCase());
      //生成insert语句关键字段部分
      if(OperType.equals("insert")){
       insSql1+=fieldname+",";
       if((sFieldValue==null) ){
        //表单未提交关键字段数据值时,本文只按数字型处理,数据值按下一流水号计算。
        rs2= Stmt. executeQuery("SELECT max("+fieldname+")+1 FROM "+tablename);rs2. next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+",";      }else if(Datatype.equals("DATE")){
        insSql2+= "To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
       }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
    insSql2+=""" + sFieldValue+"",";}
       else /*NUMBER,FLOAT */ insSql2+=sFieldValue+",";}
       //生成update,delete语句where部分:where fieldname=... AND
       if(OperType.equals("update") || OperType.equals("delete")){
        if(Datatype.equals("DATE")){
         whereSql+=fieldname+"=To_Date("" + sFieldValue + "","YYYY-MM-DD") AND ";
        }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
         whereSql+=fieldname+"="" + sFieldValue+"" AND ";}
        else /*NUMBER,FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";}
      }
     }
    whereSql=whereSql.substring(0,whereSql.length()-4);
      3)非关键字段部分sql语句生成
      update语句,如:update table1 set column1=value1,… where id=100
      insert语句,如:insert into table1(id,column1,…)values(100,value1,…)
    updateSql="update "+tablename+" set ";
    strSql="SELECT column_name,data_type,data_length,data_precision,data_scale FROM  v_dbstru a "+"where table_name=""+tablename+"" AND a.column_name not in (SELECT    b.column_name FROM v_pkey_column b where b.table_name=a.table_name)";
    rs1=Stmt.executeQuery(strSql);//取非关键字段字段名和数据类型
    while(rs1.next()){
      fieldname=rs1.getString("column_name");Datatype=rs1.getString("data_type");    sFieldValue=request.getParameter(fieldname.toLowerCase());//若表单未提交该字段 的值,则忽略该字段的处理
     if((sFieldValue!=null)){
      //生成insert语句=insSql1+insSql2 即insert into tablename(… 和 values(…
      if(OperType.equals("insert")){ insSql1+=fieldname+",";
      if(Datatype.equals("DATE")){
       insSql2+= "To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
      } else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
       insSql2+=""" + sFieldValue+"",";}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+",";}
      //生成update语句=updateSql+whereSql 即update tablename set ... where  fieldname=... if(OperType.equals("update")){
     if(Datatype.equals("DATE")){
      updateSql+=fieldname+"=To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
     }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
      updateSql+=fieldname+"="" + sFieldValue,1}+"",";}else /*NUMBER,FLOAT*/ updateSql+=fieldname+"="+sFieldValue+",";} ))
     rs1.close();
      4)生成完整的sql语句并执行
    if(OperType.equals("insert"))
     opSql=insSql1.substring(0,insSql1.length()-1)+")"+insSql2.substring(0,insSql2.length()-1)+")";
    if(OperType.equals("update"))
     opSql=updateSql.substring(0,updateSql.length()-1)+" "+whereSql;if(OperType.equals("delete"))
     opSql="delete FROM "+tablename+" "+whereSql;
    //已生成完整的sql语句opSql
    try{sqlnrows=Stmt.executeUpdate(opSql);}
    catch(SQLException e){out.println("SQLException:"+opSql);}
      4、特点
      该方法对所有这种直接存储的表单都统一使用本程序,具有通用性,不必对每个表单或每个数据表独立开发相应程序,开发工作量非常少,调用也非常 简便。同时,在表结构变动时,不用修改DBdataStore.jsp程序。本程序也可改写为Servelet,调用格式为<Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">。
      结束语
      在Web应用中,如果表单数据在提交后,还需要服务器后台作进一步的数据校验或处理,则需要采用第二种方法。但很多情况是用户在表单中输入或 修改数据,在前台浏览器端使用javascript对数据进行简单校验或处理,然后提交,在后台服务器端不作任何处理,直接将表单提交的数据存储到数据库 的一个表中。这时候采用第三种方法非常简便,可以大大减轻开发人员的工作量

    end

  • 相关阅读:
    svg使用
    人生是 立体, 不是平面, 股票大作手不太好的结局
    react 管理平台
    首页性能优化
    vue 安装插件
    python中如何对list之间求交集,并集和差集
    Java中String直接复制和new String创建对象的区别以及equals和==的区别和效率对比
    关于二叉树的总结
    Postgresql 数据库,如何进行数据备份以及导入到另外的数据库
    Java List详解,面试中应该如何解答关于List的问题
  • 原文地址:https://www.cnblogs.com/lindows/p/14390586.html
Copyright © 2011-2022 走看看