1. 页面之间参数传递
例如有表单页面 1.html ,里面有文本域 name 熟悉为 UserName (或者是一个超链接, href 属性为 1.jsp?UserName=’cmj’ ),提交到 1.jsp ,在 1.jsp 中就可以使用 <%String uname=request.getParameter(“UserName”)%> 进行接收。
2. 避免使用 out.print ()
在 jsp 页面中应该尽量避免使用 out.print() ,除非是为了测试需要,否则,应该使用 scriptlet (即 java 小程序)来处理。
3. 排除页面乱码
在 jsp 中如何避免出现乱码?其实很简单,乱码是因为编码格式不正确造成的,我们只需要在 jsp 中指定编码格式。在页面的开头部分添加: <%@ page contentType="text/html;charset=gb2312"%>
4. 两种文件包含
Jsp 中可以使用两种方式包含一个文件:第一种 <%@ include file="5.1.jsp"%> ;第二种: <jsp:include page="5.1.jsp" /> 。但是两种方式有着很大的处理区别:第一种是先包含再处理,第二种是先处理再包含。意思就是说如果包含文件中有 java 代码,用第一中包含就会先将文件当成文本包含进来,然后在执行文本中的 java 代码;而第二种方式就首先执行文件中的 java 代码,而后再将执行后的文本内容包含进来。
5. 两种页面跳转
第一种无条件跳转,也就是只要只想到这一段代码就会跳转。例如在 6.jsp 页面有这样一段 java 代码(这里在跳转的同时还传递了参数):
<%
String pwd="123456";
%>
<jsp:forward page="6.1.jsp" >
<jsp:param name="userName" value="cmjstudio"/>
<jsp:param name="userPwd" value="<%=pwd%>" />
</jsp:forward>
但是打开这个页面的时候地址栏是不会更改的,还是 6.jsp ,而不是 6.1.jsp 。这种情况属于页面内容跳转,是服务器端跳转。也就是说用户请求没有改变,还是 6.jsp 。但是页面内容会变成 6.1.jsp 的内容,而且还将参数 userName 和 userPwd 传递到了 6.1.jsp 。
第二种就是客户端跳转, response.sendRedirect("6.1.jsp") ,是在所有代码执行之后才跳转,而上面的跳转在遇到 jsp:forward 之后就不再执行,无条件跳转。
6. 四种属性范围
在 jsp 中有四种属性范围: application 、 session 、 request 、 page 范围依次减小,和其他 web 应用程序相似。设置属性分别是: application.setAttribute(“ 属性名 ”) 、 session.setAttribute(“ 属性名 ”) 、 request.setAttribute(“ 属性名 ”) 、 pageContent.setAttribute(“ 属性名 ”) ;获得属性对应的是: application.getAttribute(“ 属性名 ”)……
可以发现 page 范围的属性是用 pageContent 实现的,而事实上另外其他三种属性范围也都是通过 pageContent 实现的。例如: pageContext.setAttribute("name","cmj",pageContext.PAGE_SCOPE)
pageContext.setAttribute("name","cmj",pageContext.APPLICATION_SCOPE) 等,
接收是对应的 pageContext.getAttribute("name")/application.getAttribute("userPwd") 等。
7. 表单提交中的特殊符号
有时候我们在就收表单值时会出现意想不到的结果,乱码或其他状况。这个时候我们可以在用 reques 接受的时候,在就收之前加上: request.setCharacterEncoding("gbk"); 来限定编码方式。
8. 设置头信息
设置头信息通过 response.setHead 例如我们通过 response.setHeader("refresh","1"); 设置每秒钟刷新一次
9. cookie 和 session
在 jsp 中可以通过以下代码设置和读取 cookie 信息:
Cookie c1=new Cookie("name","cmj");
c1.setMaxAge(60);// 设置 cookie 的有效期为 60 秒
response.addCookie(c1);// 服务器端给客户端设置 cookie
Cookie[] c=request.getCookies();// 服务器端读取客户
for(int i=0;i<c.length;++i){
Cookie temp=c[i];
temp.getName()}
设置和读取 cookie 的信息不再赘余,在四种属性范围已经说过。但是注意:注销 session 用 session.invalidate(); 另外 session 使用了 cookie 的机制, cookie 被禁用以后, session 也不能使用。
10. 文件 / 目录路径
有时候我们需要获得服务器的工作目录等可以试试下面的几种方法:
工作目录真实路径 ( 两种方法都可以 ) :
<%=application.getRealPath("/")%>
<%=getServletContext().getRealPath("/")%>
事实上它是通过在 tomcat 中的配置路径得到的 . 实际中常常用 getServletContext() 方法代替 application 但是这个 getServletContext() 是由哪个对象条用的呢?事实上对所有的 web 应用程序都有一个 web 容器,这个方法就是有 web 容器调用的,可以加一个 this 试一下: <%=this.getServletContext().getRealPath("/")%>
11. 如何保存数据库连接字符串
数据库连接字符串我们一般不希望直接在代码中出现,这时我们可以通过在 web.xml (整个站点的配置文件)来配置,将连接字符串写到 web.xml 中
格式:
<servlet>
<init-param>
<param-name>connection</param-name>
<param-value> 连接字符串 </param-value>
</init-param>
</servlet>
读取方法可以调用 jsp 内置对象 config 来读取。(顺便说一下我们在 jsp 中用到的 out 也是 jsp 内置对象)
12. 连接 mysql
<%!
// 驱动字符串
String DBDRIVER="sun.jdbc.odbc.jdbcodbcDriver";
// 数据库连接地址
String DBURL="jdbc:odbc:JavaTest";// 其中 JavaTest 是 odbc 中的数据源名称
Connection conn=null;
//Statement 对象,用于操作数据库
Statement stmt=null;
%>
<%
//1. 加载数据库驱动
try{
Class.forName(DBDRIVER);
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}
//2. 创建数据库连接
try{
conn=DriverManager.getConnection(DBURL);
}catch(SQLException ex){
ex.printStackTrace();
}
//3. 操作数据库
try{
String sql="insert into tb_Person(UserName,UserPwd,Age) values('nyx','123',20)";
stmt=conn.createStatement();
stmt.executeUpdate(sql);
}catch(SQLException ex){
ex.printStackTrace();
}
//4. 关闭数据库
try{
stmt.close();
conn.close();
}catch(SQLException ex){
ex.printStackTrace();
}
%>
补充:
(1) jdbc 连接数据库 ( 这里以 oracle 、 mysql 为例,在 oracle/mysql 安装目录找到相应驱动拷贝到 tomcat 的 lib 目录 )
I . oracle
String DBDRIVER="oracle.jdbc.driver.OracleDriver";
String DBURL="jdbc:oracle:thin:@localhost:1521:HR";
String USER="HR";
String PASSWORD="123456";
Connection conn=null;
Statement stmt=null;
II . Mysql
String DBDRIVER="com.mysql.jdbc.Driver";
//String DBDRIVER="org.gjt.mm.mysql.Driver";
String DBURL="jdbc:mysql://localhost/db_JavaTest";
String USER="root";
String PASSWORD="123456";
Connection conn=null;
Statement stmt=null;
(2) 如何读取数据
String sql="select * from tb_Person";
stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
int id=rs.getInt("ID");
String name=rs.getString("UserName");
String password=rs.getString("UserPwd");
int age=rs.getInt("Age");
}
(3) 防止 SQL 注入
String sql="insert into tb_Person(UserName,UserPwd,Age) values(?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,name);
pstmt.setString(2,password);
pstmt.setInt(3,age);
pstmt.executeUpdate();
(4) 执行批处理
String sql1="insert into tb_Person(UserName,UserPwd,Age) values('nyx','123',20)";
String sql2="insert into tb_Person(UserName,UserPwd,Age) values('wty','123',20)";
String sql3="insert into tb_Person(UserName,UserPwd,Age) values('ljh','123',20)";
String sql4="insert into tb_Person(UserName,UserPwd,Age) values('zdp','123',20)";
String sql5="insert into tb_Person(UserName,UserPwd,Age) values('wys','123',20)";
stmt=conn.createStatement();
conn.setAutoCommit(false);// 禁止自动执行
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
stmt.addBatch(sql4);
stmt.addBatch(sql5);
stmt.executeBatch();// 执行批处理
conn.commit();// 提交
13. javabean
由于 javabean 相应的描述比较多,参见我的另一篇:谈谈 javabean