1、MIME(Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务):就是指定某个扩展名文件将使用何种应用程序打开的一个说明。
例如:<%@ page language="java" contentType="text/html;charset=GBK"%>
注意:如果MIME类型设置错误,可能出现下载提示框。例如:将“text/html;charset=GBK”写为“test/html;charset=GBK”。
注意:下载框必须指定MIME类型。
如果自己想指定下载文件的名称,则使用以下语句:
<%
response.setHeader("Content-Disposition","attachment;filename=张三.doc")
%>
2、文件编码问题contentType和pageEncoding
contentType中的charset指的是服务器发送给客户端的内容编码;
pageEncoding指的是JSP文件本身的编码。
在JSP中,如果pageEncoding存在,那么JSP编码将由pageEncoding决定,否则将由charset属性决定,如果两者都不存在,则将使用ISO-8859-1的编码方式。
3、错误页问题
完成错误页的搓澡,一定满足两个条件:
指定错误出现时的跳转页,通过errorPage属性指定;<%@ page errorPage="error.jsp"%>
错误处理页必须有明确的标识,通过isErrorPage属性指定。<%@ page isErrorPage="true"%>
服务器端跳转:内容显示虽然改变了,但是地址栏没有改变,在整个操作中,客户端对服务器只发送了一次请求,服务器对客户端也只回应了一次。例如:错误页跳转。
客户端跳转:程序跳转后,页面的地址栏发生改变了。例如超链接。
这些错误是在每一个JSP页面中指定的,如果想在整个目录中指定全局的错误处理,就必须修改web.xml。全局的错误处理可以处理两种类型错误,一种是HTTP代码错误,例如:404,还有一种是异常的错误,例如:NullPointerException等。例如:
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>
注意:在错误页的操作中,如果出现了无法显示error.jsp页面的情况,则有可能是Tomcat将error.jsp也认为是出现了错误,从而无法跳转,此时,可以直接在error.jsp中编写一下语句:
<%@ page language="java" contentType=text/html"pageEncoding="GBK"%>
<%@ page isErrorPage="true"%>
<%response.setStatus(200);%>
此语句设置了一个200的HTTP状态码,表示本页没有错误,可以正确显示。
4 、数据库连接操作
将数据库驱动程序复制到Tomcat\lib目录下。
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql"%>
<html>
<head><title>连接数据库</title></head>
<body>
<%!
public static final String DBDRIVER="org.gjt.mm.mysql.Driver";//定义数据库驱动程序
public static final String DBURL="jdbc:mysql://localhost:3306/数据库名称";//数据库连接地址
public static final String DBUSER="root";//数据库连接用户名
public static final String DBPASS="mysqladmin";//数据库连接密码
%>
<%
Connection conn=null;//声明数据库连接对象
PreparedStatement pstmt=null;//声明数据库操作
ResultSet rs=null;//声明数据库结果集
%>
<%
try{ //数据库操作中会出现异常,所以要使用try...catch处理
Class.forName(DBDRIVER);//数据库驱动程序加载
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);取得数据库连接
String sql="SELECT empno,ename,job,sal,hiredate FROM emp";
pstmt=conn.prepareStatement(sql);//实例化prepareStatement 对象
rs=pstmt.executeQuery();//执行查询操作
%>
<center>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>雇员工作</td>
<td>雇员工资</td>
<td>雇佣日期</td>
<tr>
<%
while(rs.next()){//循环emp表中的行记录
int empno=rs.getInt(1);//取出雇员编号
String ename=rs.getString(2);//取出雇员姓名
String job=rs.getString(3);
float sal=rs.getFloat(4);
java.util.Date date=rs.getDate(5);
%>
<tr>
<td><%=empno%></td>
<td><%=ename%></td>
<td><%=job%></td>
<td><%=sal%></td>
<td><%=date%></td>
</tr>
<%
}
%>
</table>
</center>
<%
}catch(Exception e){
System.out.println(e);
}finally{ //程序的统一出口
rs.close();//关闭结果集
pstmt.close();//关闭操作
conn.close();//关闭连接
}
%>
</body>
</html>
5、乱码解决
在Web开发中,使用request接受请求参数是最常见的操作,但是,在进行参数提交时也会存在一些中文的乱码问题。
在JSP中加入一句即可解决问题:
request.setCharacterEncoding("GBK");//设置统一编码
String content=request.getParameter("info");//接受表单提交的参数
注意:单一的参数都可以使用getParameter()接受,而一组参数药用getParameterValues()接受。在表单控件中,像文本框(text)、单选按钮(radio)、密码框(password)、隐藏域(hidden)等,一般都会使用getParameter()方法进行接受,因为这些控件在使用时参数的名称都只有一个不会重复;而像复选框(checked),一般参数的名称都是重复的,是一组参数,所以只能使用getParameterValues()接受,如果不小心使用了getParameter()方法,则只会接受第一个选中的内容。
注意:在进行表单参数接受时,如果用户没有输入文本框内容或者没有选择复选框内容,那么在使用getParameter()或getParameterValues()接收参数时,返回的内容为null,此时就有可能产生NullPointerException,所以在使用时最好判断接收来的参数是否为null。
即:
<%
String inst[]=request.getParameterValues("inst"); //接受复选框提交的参数
if(inst!=null){ //判断是否有内容
for(int x=0;x<inst.length;x++){
%>
<%= inst[x]%>
<%
}
%>
<%
}
%>
URL地址写法:动态页面地址?参数名称1=参数内容1&参数名称2=参数内容2&...
所有参数与之前的地址之间使用“?”分离,然后按照“参数名称=参数内容”的格式传递参数,多个参数之间使用“&”分离。
<%
String param1=request.getParameter("参数名称1");//接受参数
String param2=request.getParameter("参数名称2");//接受参数
%>
6、response对象的用法
头信息:客户端在进行请求时会发送许多额外的信息,这些信息就是头信息,服务器端也可以根据需要向客户端设置头信息,在所有的头信息设置中,定时刷新页面的头信息使用最多,直接使用setHeader(),将头信息的名称设置为refresh,同时制定刷新的时间。
定时刷新页面的设置语句:
<%
response.setHeader("refresh","2");//设置两秒一刷新
%>
设置此网站访问了次数的语句:
<%!
int count=0;//定义全局变量
%>
<h3>已经访问了<%=count++%>次!</h3>
设置三秒后跳转到其他页面的语句:
<h3>3秒后跳转到hello.htm页面,如果没有跳转请按<a href="hello.htm">这里</a></h3>
<%
response.setHeader("refresh","3;URL=hello.htm");//3秒后跳转到hello.htm
%>
注意:如果上面的3改为0,则表示无条件立刻跳转。定时跳转属于客户端跳转。
设置头跳转头信息的另一种方式:
<META HTTP-EQUIV="refresh" CONTENT="3;URL=hello.htm">
<body>
<h3>3秒后跳转到hello.htm页面,如果没有跳转请按<a href="hello.htm">这里</a></h3>
</body>
页面跳转的另一种方式:
<%
response.sendRedirect("hello.htm");//直接跳转到hello.htm
%>
注意:这种跳转也属于客户端跳转
注意:服务器端跳转与客户端跳转之间的区别:<jsp:forward>属于服务器端跳转,跳转至后地址栏的信息并没有任何改变;而response.sendRedirect()属于客户端跳转,跳转至后地址栏会改变的。在使用request属性范围时,只有是服务器端跳转才能够将request属性保存到跳转页,如果是客户端跳转,则无法进行属性的传递。另外,如果使用的是服务器端跳转,则执行到跳转语句时会立刻进行跳转,如果使用的是客户端跳转,则是在整个页面执行完之后才执行跳转。
7、session对象:主要用于完成用户的登录(login)、注销(logout)等常见功能。
用户的登录:
session.setAttribute("userid",name);//将登录的用户名保存在session中
session.getAttribute("userid");
判断是否是新用户:
<%
if(session.isNew()){
%>
<h3>欢迎新用户光临</h3>
<%
}else{
%>
<h3>您已经是老用户了!</h3>
<%
}
%>
取得用户的操作时间:
<%
long start=session.getCreationTime();//取得创建时间
long end=session.getLastAccessedTime();//取得最后一次操作时间
long time=(end-start)/1000; //得出操作的秒
%>
<h3>您已经停留了<%=time%>秒!</h3>
8、每次修改JavaBean都需要重启服务器,会很麻烦,但是加上以下语句,即可自动启动:
<Context path="/mldn" docBase="D:\mldnwebdemo" reloadable="true"/>
直接在配置虚拟目录的位置上增加一个reloadable属性即可,但是这种情况只适合于开发。因为使用reloadable自动加载后,服务器将始终处于监视状态,一旦发现类修改后就要立刻重新加载,运行的性能是比较低的,所以,在项目真正发布运行时一定要将reloadable的内容设置为false,以提升服务器的运行性能。