尚学堂shopping的经验--终结版

1 . 一般 , 我们要写项目的路径时 , 我们的项目可能拿到其他的机器里运行 , 故应该改为如下 ,

http://localhost:8080/ 项目的名称

=request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() +

request.getContextPath()

 

2. request.get 的方法传的编码是 :8859_1, 可用以下语句更改 :

String keyword = new String(request.getParameter("keyword").getBytes("8859_1"), "GBK");

 

3 . 当提示类型不匹配时 ( 类型名相同 ) , 很可能是包引入错误 .

 

 

4 在调用 TV20.js 文件里的 treeview_box_0_none = "images/4_clos.gif"( 路径 )  ; url 是相对于调用它的 jsp 文件的相对路径 .

 

5 . 面 向接口 :    例如 : shopping 中做 products DAO , 为方便用 不同的数据库 (SQL, Oracle ), 在建立 DAO 层时 , 采用面向接口的方法 , 建立 productDAO.java interface. 然后由不用的数据库 DAO 层继

(productMySQLDAO.java productOracleDAO.java ) . 这样 , 就不用避免了重写 productDAO.java 中数据与数据库代码的组织 在做 DAO 层时 , 推荐该方法 . 这也 是有名的工厂模式

 

 

6 . 单 例模式(缓存) :   1, 写静态方法 .

                     2, 在该类构造方法中 new 成私有的 , 使得别人无法 new 它的对象 , 然后提供一静态方法为接口供访问 ( 即返回该类的对象 ). 例如 :shopping productMgr 类中就采用该方法 , 其对外提供的接口为 : getInstance();

 

7. 在发现数据库中数据显示为乱码时 , 因成数据的生成 , 传送 , 到数据库的存储间 , 一步步的寻找编码问题 .

 

8 . MySQL , 数据库编码 的问题 可由两种方法解决 :

              , 开始 -> 程序 ->…… My server Instance config Wizard 重新做设置设定 ;

              , MySQL 安装处的 my.ini 文件里 :

              [client]

port=3306

 

[mysql]

 

default-character-set=GBK   此处为客户端的编 码 ( 即是显示给你看的窗口处 ), 可改为 GBK( 只能显示中文和英文 )

#Path to the database root

datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"

 

# The default character set that will be used when a new schema or table is

# created and no character set is defined

default-character-set=utf8

该处 为数据库内部的编码 , 强烈不建议改动 , UTF8 是国际编码 , 可显示各个国家的编码 .!

 

: 数据库编码的改动不能影响之前存储的数据 .

 

9. 关 于分页 :

              网页中显示记录经常用到分页 , 在分页技术中 :

              , 数据库语法 : 分页 : select * from article limit pageNo, pageSize;

              , 在写关于 下一页 , 上一页 功能时 ,

可将 pageSize 设置为该方法 :private static final int PAGE_SIZE = 3;

在接 受 PageNo , 还应该判断是否小于 1 , 若小于 1, 应该重新赋值为 1;

 

 

10. get 方法 提交

<a href = "productsearch.jsp?action=<%=action%>&keyword=<%=keyword%>&lownormalprice=<%=lownormalprice%>&highnormalprice=<%=highnormalprice%>&lowmemberprice=<%=lowmemberprice%>&highmemberprice=<%=highmemberprice%>&startDate=<%=startDate%>&endDate=<%=endDate%> &categoryid=<%=categoryid%>&pageno=<%=pageNo + 1%>"> 下一页 </a>

 

在做 String strStartDate = request.getParameter( "startDate" ); 接收时, 系统会把它当作 startDate = null, 于是, strStartDate = null

 

11. 关于页面的跳转

    一. response.sendRedirect(). 该方法会实现页面跳转,但会丢失数 据, 即不能传送数据。 (pose, get 方 法的数据 )

    二. <jsp:forward page=”complexsearchresult.jsp“></jsp:forward> 这个便可以传送数据了。

 

12.session 的典型运用 保存 .

       例如 : shopping 视频 41 buy.jsp ,

一.    Cart cart = (session)session.getAttribute(“cart”);

session.setAttribute(“cart”, cart);

                     .<jsp:useBean id = “cart” type=”com.shopping.Cart” scop = “session”></jsp:useBean>

              13. 如 何在 input 中 利用 name 传 递 数值 :

              例如 : shopping 45 视频 cart.jsp ,     

input 中填补后传递给另一个页面时 , 若需要同时传递 id value, 可用 name 传递 id, 写法如下 :

<input type = text size=4 name = “<%= “p” + ci.getProductId() %>” value = “<% ci.getCount %>                     // 加上 p 是为了让它变成字符后 , 然后才可以传递

接受 可用 :

String strProductId =  request. getParameter( “p” + ci.getProductId());

然后 直接把 strProductId Integer.parseInt 化即可拿到该值 .

  14. 如 何写好路径问题 当你要加载的路径不能够用到相对路径(由于服务器的不同可能引发错误路径, 例如图片的加载) 那么, 你要考虑到用到一个 path 文件, 然后从 path 文件中读取出来了, 当我们要移植到不同的机器上时, 只需修改 path 文件即可。 Eclipse 中推荐写在 classpath 目录下。

或者 path 文件可写在 WEB_INF 下的 web.xml

<servlet>

              <description>upload a file to server</description>

              <display-name>FileUpload</display-name>

              <servlet-name>FileUpload</servlet-name>

              <servlet-class>

                     com.bjsxt.shopping.util.servlet.FileUpload

              </servlet-class>

              <init-param>

                     <param-name>uploadPath</param-name>

                     <param-value>

                            D://share//JavaProjects//Shopping//WebRoot//images//product//

                     </param-value>

              </init-param>

       </servlet>

然 后, class 中读出:

public void init(ServletConfig config) throws ServletException {

String uploadPath = config.getInitParameter("uploadPath"); // 用于存放上传文件的 // 目录

}

或者 (在 J2se )用一个 properties 文件,与所用到的类建立在一起, 保存属性, 再从中读出来。

private static Properties props = new Properties();

      

       static {

              try {

                     props.load(Test.class.getClassLoader().getResourceAsStream("com/bjsxt/dp/observer/observer.properties"));     

/* 若是一个只有一个 properties 文件,可放在 bin 目录下, bin class path 路径 */

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

      

       public static String getProperty(String key) {

              return props.getProperty(key);

String[] observers = PropertyMgr.getProperty("observers").split(",");

/* 以逗号为分界,保存成 String 数组 */

       }

for(String s : observers) {

       Class.forName(s).newInstance();// 此时返回的是 Object 类型, 应做强制转换

}

 

properties 文件这么写:

key=com.bjsxt.dp.observer.Dad,com.bjsxt.dp.observer.GrandFather,com.bjsxt.dp.observer.Dog

 

15. servlet 中的页面跳转 (重定向):

       this.getServletContext().getRequestDispatcher("/admin/SalesCount.jsp")

                            .forward(request, response);

这里 比较要注意的是:

       .在 SalesCount.jsp 接收时, jsp 接收的路径是相对于 servlet 的。而不是相对于根目录。

   .在写路径的时候, servlet 在路径的最前面要加斜杠“ /

                            jsp 在路径的最前面无需加。

 

16. 关于自定义标签。

  javax.servlet.jsp.tagext.SimpleTagSupport 继承并重写 doTag 方法

此处 是输入 HelloWorld From Tag

 

package com.bjsxt.shopping.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class HelloWorldTag extends SimpleTagSupport {

 

       @Override

       public void doTag() throws JspException, IOException {

              this.getJspContext(). getOut().write("HelloWorld From Tag");// 拿到上下文

       }

}

二、 WEB_INF 目录或 WEB_INF 子目录下建立 .tld 文件, 即自定义标签的说明文件。

 

.tld 文件如下:

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

 

<taglib 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-jsptaglibrary_2_0.xsd"

       version="2.0">

 

  <tlib-version>2.0</tlib-version>

  <short-name>mytag</short-name>   //mytag , 例如: <mytag: helloworld>

  <uri>/HW</uri>                // 标识符

  <tag>

    <name>helloworld</name>

    <tag-class>com.bjsxt.shopping.tag.HelloWorldTag</tag-class>  // 相对应的标签 库处理类

           /*

           标签中间 是否是空的 , <mytag: helloworld> </mytag: helloworld>

       */

    <body-content>empty</body-content>                     

                                  

  </tag>      

</taglib>

 

三、 jsp 文件中引入:

<%@ taglib prefix="mytag" uri="/HW" %>                //prefix 是前面指的短名是指前面的标识符

 

Javascript:

1. 接收 status 的值, 并在接受后 select 里选中

<center>

       下单人: <%=so.getUser().getUsername() %>

       <form name="form" action="OrderModify.jsp" method="post">

              <input type="hidden" name="action" value="modify">

              <input type="hidden" name="id" value="<%=id %>">

              <select name="status">

                     <option value="0"> 未处理 </option>

                     <option value="1" > 已处理 </option>

                     <option value="2"> 废单 </option>

              </select>

              <br>

              <input type="submit" value=" 提交 ">

       </form>

</center>

 

<script type="text/javascript">

                            for(i=0; i<document.forms("form").status.options.length; i++) {

              if(document.forms("form").status.options[i].value == <%=so.getStatus()%>) {

                     document.forms("form").status.selectedIndex = i;

              }

             

       }

</script>

MySQL 数据库

 

insert into `mis`.`users`  ( name, age) values ( "ywm", 13)

 

select id, name, age from `mis`.`users` limit 0, 50

 

delete from `mis`.`users` where id > 8

 

update `mis`.`users` set name = "ywm1" where id = 13

 

1. 分页倒序 select * from article order by id desc;

分页 :                    select * from article limit pageNo, pageSize;

总共有多少条记录 :      "select count(*) from product");

多少页 :         pageCount = (rsCount.getInt(1) + pageSize - 1)/pageSize;

2. 设定时间格式 select * from article order by id desc;

连接字符串

3. 查看表的各个数据类型 desc article;

4 . 关于自然连接 Join select p.id, p.name, p.descr, p.normalprice, p.memberprice, p.pdate, p.categoryId, c.id cid, c.pid cpid, c.name cname, c.descr cdescr, c.leaf, c.grade  from product p join category c on (p.categoryid = c.id) limit 0,3

5 . 导入数据库的语句 :    ./ D://(sql 语句文件所在路径路径 )

6. MySQL 的事务处理:

conn. setAutoCommit(false);

SQL 语句

conn.commit();

conn. setAutoCommit(true);

然后在抛出异常处

conn. setAutoCommit(true);

conn.rollback();

7 MySQL 中,有些字段是自动增长 的, Id 如何拿到刚生成的 Id 呢?

preparedStatement pstmt = conn. preparedStatement(sql, Statement. RETURN_GENERATED_KEYS);

ResultSet rsKey = pstmt. getGeneratedKeys();

rsKey. next();

int KeyId = rsKey. getInt(1);

这样 KeyId 就拿到了。

8. 关于 MySQL 的批处理

       pstmt. addBatch();

       psmt. executeBatch();

9. 日期处理。

       使用 SimpleDateFormat

       使用 java.sql.Timestamp

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值