精简版BBS学习札记(二)

1、JSP文件放置的位置可以与HTML文件放置的位置一样,但是 JSP文件一定不能放在WEB-INF或者META-INF文件下

2、WEB-INF文件中只能放三种文件
   1)、class文件
   2)、lib文件
   3)、web.xml

3、在JSP文件通过URL传参数时,一定要注意参数前后的空格问题!,一般情况下是不能有空格的!
   1)、如果是post的传递呢?
       解决:请你把接收过来的参数打印出来(打印在后台)
   2)、如果怀疑传过来的参数(如id)带空格(这样让人感到很不爽!)!
       解决:在打印参数的前后加一些字符即可!

4、在提交表单时,用自身提交(即自己提交给自己),而且同时这个JSP文件也有一个外链接,如何区别是外链接?还是自身提交呢?
   用隐含域
   如:这是一个Post.jsp文件! 下面两段代码是在同一个JSP文件中!
  
       //这是在HTML区域	
      <form action="Post.jsp" method="post">
         <input type="hidden" name="action" value="post"> //隐含域
                 ....
      </form>
   

    可以在JSP区域中写如:
String action = request.getParameter("action") ;
//if(action !=null && action.equals("post")) {
if("action".equals(action)) {
...
}
 


还有一个外链接是:
//这个外链接是在ShowArticleTree.jsp文件中
<a href="Post.jsp">发表新帖</a>

如果是外链接是不是执行if里的语句(因为没有传递action),而在表单中提交时会执行的(因为传递action了!)

5、在发表新主题时,pid(pid为父id)肯定为0,那rootid(根id)呢?因为rootid是数据库自动递增的id,那如何将这个自动递增的id传给rootid呢?
   1)、这个新发表主题的id是当前最大的id,用SELECT语句找到这个最大的id,然后再更新一下,就可以了!,不过这时,插入新主题的SQL语句与找到最大id的SQL语句以及更新语句都必须同时放在一个事务中!
   2)、在java中API提供了一个方法可以帮我们拿到PrepareStatement对象自动生成的键(key),这即Statement.RETURN_GENERATED_KEYS
conn.setAutoCommit(false) ;
	
	
	String sql = "insert article values(null, 0, ?, ?, ?, now(), 0)" ;
	PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) ;  //Statement.RETURN_GENERATED_KEYS是拿到预编译语句中的自动生成的KEYS!这里的KEYS为什么是复数呢?因为这个方法会生成很多KEY,但是这里的KEY不是指问号!!!
	Statement stmt = conn.createStatement();

	pstmt.setInt(1, -1) ;
	pstmt.setString(2, title) ;
	pstmt.setString(3, cont) ;
	pstmt.executeUpdate() ;
	
	ResultSet rsKey = pstmt.getGeneratedKeys() ; //拿到自动生成的KEYS
	rsKey.next() ;
	int key = rsKey.getInt(1) ; //拿到第一个KEY,因为第一个KEY就是rootid!
	rsKey.close() ; //因为后面的语句不需要rsKey参与了,因此在这里就可以关闭了!
	stmt.executeUpdate("Update article set rootid =" + key + "where id=" + key) ;

	conn.commit() ;
	conn.setAutoCommit(true) ;

这样就可以更新rootid了!

6、将HTML文件改成JSP文件,首先引入JSP文件头部:
<%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %>


7、为什么在Login.jsp中,
  1)要用session.setsession.setAttribute("admin", "true");
     然后再 重定向到主页面呢?
  2)而不用request.setAttribute("admin", "true") ;
     然后再 转发到主页面呢?
是因为关于URL的改变吗?还是因为session和request的范围不同呢?

因为两者的使用范围不同
      比如用方法2)来登录,虽然登录上了,但是如果进行下一步操作(如:修改或者删除帖子等)后, 刷新页面,则刷新后的页面,就退出了你以管理员身份登录后台的操作了!这是因为(也体现了)HTTP协议是不连续的(即无状态性的),如果以这样方式登录后台,操作一步,退出一步,然后再登录一步!那管理员是不是都疯了!        
     而用方法1)是在整个会话中都存在的,只要不关闭当前的浏览器窗口,你的身份就是管理员!

8、当用eclipse或者myeclipse看JSP文件时,同时这个文件含有大量的HTML语句,可以借助右边有一个Outline视图来看一个一个小标签(或者模块)!

你可能感兴趣的:(eclipse,sql,jsp,MyEclipse,bbs)