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 类