<!--注释内容-->
<%
//单行注释
/*多行注释*/
%>
隐式注释客户端无法看见
<%%>:主要用于定义局部变量、编写语句
<%!%>:主要用于定义全局变量、方法、类,不能出现其他语句
尽量不要在JSP中定义类和方法
<%=%>:表达式输出
<% String info = "www.baidu.com"; %>
<h1>website=<%=info%></h1>
scriptlet标签使用效果和<%%>一样
<jsp:scriptlet>
String url="www.baidu.com";
</jsp:scriptlet>
<h2><%=url%></h2>
MIME表示打开文件的应用程序类型,
page指令中,contentType可以指定文件的显示方式
例如:
<%@ page language="java" contengType="text/html;charset=GBK"%>
<%@ page language="java" contengType="application/word;charset=GBK"%>
charset是指服务器发送给客户端的内容编码,pageEncoding指的是JSP文件本身的编码。如果pageEncoding存在,那么JSP编码由pageEncoding决定,否则由charset决定,如果两个属性都不存在,则默认为ISO-8859-1
例如:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
一般一个JSP页面只需要按照网页显示(text/html),则使用pageEncoding设置编码即可。
错误页设置两步骤:
1. errorPage属性指定错误出现时的跳转页;
2. isErrorPage属性指定错误页标识
例如:
错误页中:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@page errorPage="error.jsp"%><!--一出现错误即跳转到错误处理页-->
错误处理页中:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@ page isErrorPage="true"%><!--表示该页面用于处理错误-->
错误页跳转输入服务器端跳转
可以修改Web.xml文件,实现在虚拟目录指定全局的错误处理
<error-page>
<error-code>500</error-code>
<location>/ch05/error.jsp</location>
</error-page>
依然服务器端跳转
在page指令中可以使用import导入所需要的java开发包,导入java.sql包,进行数据库开发。
配置数据库的驱动程序,将mysql的驱动程序mysql-connector-java-5.0…复制到tomcat6.0\lib目录中,并重启服务器
例如:使用JSP列出emp表数据
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
<head><title>www.bruce.com</title></head>
<body>
<%! //定义数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; public static final String DBURL = "jdbc:mysql://localhost:3306/mldn"; public static final String DBUSER = "root"; public static final String DBPASS = "mysqladmin"; %>
<% Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; %>
<% try{ Class.forName(DBDRIVER); conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS); String sql = "SELECT empno,ename,job,sal,hiredate FROM emp"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); %>
<center>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>雇员工作</td>
<td>雇员工资</td>
<td>雇员日期</td>
</tr>
<% while(rs.next()){ 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){ e.printStack(); }finally{ rs.close(); pstmt.close(); conn.close(); } %>
</body>
</html>
没有Java代码的页面写成静态页面的后缀,可以适当提升运行速度
语法:<%@ include file = "要包含的文件路径"%>
包含的文件可以是JSP,HTML,文本,或者是一段Java程序。包含操作实际上是将被导入的文件内容导入,一起进行编译,最后再将一份整体的内容展现给用户
例如:
<body>
<%@include file="info.html"%>
</body>
语法:
1. 不传递参数:
<jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false"/>
<jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false">
<jsp:param name="参数名" value="参数内容"/>
//可以传递多个参数
</jsp:include>
例如:
包含页:include_demo.jsp
<jsp:include page="receive_param.jsp">
<jsp:param name="name" value="<%=username>">
<jsp:param name="info" value="Bruce">
</jsp:include>
被包含页:receive_param.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<h1>参数1:<%=request.getParameter("name")%></h1>
<h1>参数2:<%=request.getParameter("info")%></h1>
false表示完全被读进来再输出,true表示buffer满了就输出,一般都设置为true,默认为true
动态包含是先处理再输出
语法:
1. 不传递参数:
<jsp:forward page="{要包含的文件路径\<%=表达式%>}"/>
2. 传递参数:
<jsp:forward page="{要包含的文件路径\<%=表达式%>}">
<jsp:param name="" value=""/>
//可以传递多个参数
</jsp:forward>
上述跳转属于服务器端跳转
内置对象 | 类型 | 描述 |
---|---|---|
pageContext | javax.servlet.jsp.PageContext | 页面容器 |
request | javax.servlet.HttpServletRequest | 请求 |
response | javax.servlet.HttpServletResponse | 回应 |
session | javax.servlet.HttpSession | 保存 |
application | javax.servlet.ServletContext | 共享信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
out | javax.servlet.jspWriter | 页面输出 |
page | java.lang.Object | |
exception | java.lang.Throwable |
属性名 | 属性范围 |
---|---|
page | 只在一个页面中保存属性 |
request | 一次请求中保存属性,服务器跳转后仍有效 |
session | 一次会话范围中保存,任何跳转都有效,重新打开浏览器无效 |
application | 整个服务器保存,所有用户都可以使用 |
4个内置对象都支持以下操作方法:
public void setAttribute(String name,Object o)
public Object getAttribute(String name)
public void removeAttribute(String name)
可以使用如下的方法修改page属性范围:
public void setAttribute(String name,int scope)
request对象主要作用是接收客户端发送来的请求,是javax.servlet.http.HttpServletRequest接口的实例化对象
常用方法 | 描述 |
---|---|
public String getParameter(String name) | 接收请求参数 |
public String[] getParameterValues(String name) | 接收一组请求参数 |
public Enumeration getParameterNames() | 取得请求参数名 |
public String getRemoteAddr() | 取得客户端IP地址 |
void setCharacterEncoding(String env)throws UnsupportedEncodingException | 设置统一的请求编码 |
public boolean isUserInRole(String role) | 用户身份认证 |
public Httpsession getSession() | 取得当前的session对象 |
pubic StringBuffer getRequestURL() | 返回正在请求的路径 |
pubic Enumeration getHeaderNames() | 取得全部头信息的名称 |
pubic Enumeration getHeader(String name) | 根据名称取得头信息的内容 |
public String getMethod() | 取得用户的提交方式(get/post) |
public String getServletPath() | 取得访问的路径 |
public String getContextPath() | 取得上下文资源路径 |
例如:
<body>
<% request.setCharacterEncoding("GBK"); %>
</body>
例如:接收表单全部内容
定义表单页:request_form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request_form.html</title>
</head>
<body>
<form action="request_demo.jsp" method="post"><!-- 用post,否则乱码 -->>
姓名:<input type="text" name="uname"><br /> 兴趣:<input type="checkbox" name="**inst" value="唱歌">唱歌<input type="checkbox" name="**inst" value="跳舞">跳舞<input type="checkbox" name="**inst" value="游泳">游泳<br /> 自我介绍:
<textarea cols="30" rows="3" name="note"></textarea>
<input type="hidden" name="uid" value="1"> <input type="submit" value="提交"> <input type="reset" value="重置">
<br />
</form>
</body>
</html>
定义读取页:request_demo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'request_demo.jsp' starting page</title>
</head>
<body>
<% request.setCharacterEncoding("GBK");//不能少,否则容易乱码 %>
<table border="1">
<tr>
<th>参数名称</th>
<th>参数内容</th>
</tr>
<% Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) { String paramName = (String) enu.nextElement(); %>
<tr>
<td><%=paramName%></td>
<td>
<% if (paramName.startsWith("**")) { String paramValue[] = request .getParameterValues(paramName); for (int i = 0; i < paramValue.length; i++) { %> <%=paramValue[i]%>、
<% } } else { String paramValue = request.getParameter(paramName); %>
<%=paramValue%>
<% } %>
</td>
</tr>
<% } %>
</table>
</body>
</html>
浏览器默认的是UTF-8
现阶段每一个JSP页面都写上编码设置
参数传递有post和get方式两种
例如:
<%@ page contextType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>取得头信息的名称和内容</title></head>
<body>
<% Enumeration enu = request.getHeaderNames(); while(enu.hasMoreElements()){ String headerName = (String)enu.nextElement(); String headerValue = request.getHeader(headerName); %>
<h5><%=headerName%>--><%=headerValue%></h5>
<% } %>
</body>
</html>
增加新用户需要修改conf/tomcat-user.xml文件。
例如:
<user username="10202357" password="Tu86511620" roles="admin" />
用户的角色会自动创建
配置完之后还需要配置web.xml文件,在web.xml文件中加入对某一资源的验证操作
角色验证即在JSP页面中调用request.isUserInRole(“”)
例如:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>获得IP\访问路径\提交方式</title>
</head>
<body>
<% String method = request.getMethod(); String ip = request.getRemoteAddr(); String path = request.getServletPath(); String contextPath = request.getContextPath(); %>
<h3>
请求方式:<%=method%></h3>
<h3>
IP地址:<%=ip%></h3>
<h3>
访问路径:<%=path%></h3>
<h3>
上下文名称:<%=contextPath%></h3>
</body>
</html>
request内置对象在实际开发中使用最多,当服务器端需要得到客户端的相关信息时就会用到request对象完成
response对象的主要作用是对客户端请求的响应,是javax.servlet.http.HttpServletResponse接口的实例
常用方法 | 描述 |
---|---|
public void addCookie(Cookie cookie) | 给客户端增加Cookie |
public void setHeader(String name,String value) | 设置回应的头信息 |
public void sendRedirect(String location)throws IOException | 页面跳转 |
例如:
设置自动刷新:
<%
reponse.setHeader("refresh","2")
%>
定时跳转:
<%
reponse.setHeader("refresh","2";URL="hello.html")
%>
定时跳转(JSP response\HTML方式)都属于客户端跳转
使用HTML完成跳转功能:
<html>
<head>
<title>测试html页面的跳转</title>
<META HTTP-EQUIV="refresh" CONTENT="3;URL=hello.html">
</head>
<body>
<h3>
3秒后跳转到hello.html页面,如果没有跳转请按<a href="hello.html">这里</a>!
</h3>
</body>
</html>
当一个页面中没有JSP代码又想执行定时跳转的时候才使用HTML形式的设置跳转头信息
例如:
<% response.sendRedirect("01.html"); %>
与<jsp:forward>
不同,response属于客户端跳转,要在整个页面执行完以后才执行跳转。
<jsp:forward>
可以方便地进行参数传递,而且服务器端跳转要比客户端跳转更常用
Cookie的常用方法 | 描述 |
---|---|
public Cookie(String name,String value) | |
public String getName() | |
public String getValue() | |
public void setMaxAge(int expiry) | 设置Cookie的保存时间,以秒为单位 |
Cookie是服务器给客户端增加的,所以使用reponse对象
例如:
<%
Cookie c1 = new Cookie("Tu","Bruce");//第一个参数是属性名,第二个参数是属性值
c1.setMaxAge(60);//Cookie保存60秒
response.addCoolie(c1);//向客户端增加Cookie
%>
例如:取出Cookie
<% Cookie c[] = request.getCookies(); for(int x = 0; x < c.length; x++){ %>
<h3><%=c[x].getName()%>--><%=c[x].getValue()%></h3>
<% } %>
在开发中session对象最主要的用处是完成用户的登录、注销等常见功能。
常用方法 | 描述 |
---|---|
public String getId() | 取得Session Id |
public long getCreationTime() | 取得Session的创建时间 |
public long getLastAccessedTime() | 取得Session的最后一次操作时间 |
public boolean isNew() | 判断是否是新的Session |
public void invalidate() | 让Session失效 |
public Enumeration getAttributeNames() | 得到全部属性的名称 |
例如:
<% String id = session.getId(); %>
<h3>
session id:<%=id%>
</h3>
服务器重启,session id一般就会消失。tomcat可以通过配置server.xml文件加入保存session操作
实例:
编写表单并进行验证login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>登录注销</title>
</head>
<body>
<form action="login.jsp">
用户名:<input type="text" name="uname" /></br> 密 码:<input type="password" name="upass"> <input type="submit" value="登录">
<input type="reset" value="重置">
</form>
<% String name = request.getParameter("uname"); String password = request.getParameter("upass"); if (!(name == null || "".equals(name) || password == null || "" .equals(password))) { if ("Bruce".equals(name) && "2222".equals(password)) { response.setHeader("refresh", "2,URL=welcome.jsp"); session.setAttribute("userid", name); %>
<h3>用户登录成功,两秒后跳转到欢迎页!</h3>
<h3>
如果没有跳转,请点击<a href="welcome.jsp">这里</a>
</h3>
<% } else { %>
<h3>错误的用户名和密码</h3>
<% } } %>
</body>
</html>
登录成功欢迎页welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'welcome.jsp'</title>
</head>
<body>
<% if (session.getAttribute("userid") != null) { %>
<h3>
欢迎<%=session.getAttribute("userid")%>光临本系统,<a href="logout.jsp">注销</a>
</h3>
<% } else { %>
<h3>
请先进行系统的<a href="login.jsp">登录</a>
</h3>
<% } %>
</body>
</html>
登录注销logout.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'logout.jsp'</title>
</head>
<body>
<% response.setHeader("refresh", "2;login.jsp"); session.invalidate(); %>
<h3>你已经成功注销,两面后自动跳转回首页</h3>
<h3>
如果没有跳转,请点击<a href="login.jsp">这里</a>
</h3>
</body>
</html>
<%
session.isNew();
%>
<%
long start = session.getCreationTime();
long end = session.getLastAccessedTime();
long time = (end-start)/1000;//得出操作的秒
%>
常用方法 | 描述 |
---|---|
String getRealPath(String path) | 得到虚拟目录对应的绝对路径 |
public Enumeration getAttributeNames() | 得到所有属性的名称 |
public String getContextPath() | 取得当前的虚拟路径名称 |
例如:
<%
String path1 = application.getRealPath("/");
String path2 = this.getServletContext().getRealPath("/");//两个方法的结果一样
%>
例如:保存表单内容在Web项目的根目录中的note文件夹中
表单递交页面form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>form.html</title>
</head>
<body>
<form action="input.jsp">
输入文件名称:<input type="text" name="filename"> 输入文件内容:
<textarea name="filecontent" cols="30" rows="3"></textarea>
<input type="submit" value="保存"> <input type="reset" value="重置">
</form>
</body>
</html>
处理页面input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>
<body>
<% String realPath = this.getServletContext().getRealPath("/"); %>
<h3><%=realPath%></h3>
<% String name = request.getParameter("filename"); String content = request.getParameter("filecontent"); String fileName = this.getServletContext().getRealPath("/") + "note" + File.separator + name; File file = new File(fileName); if (!(file.getParentFile().exists())) { file.getParentFile().mkdir(); } PrintStream ps = new PrintStream(new FileOutputStream(file)); ps.println(content); ps.close(); %>
</body>
</html>
类似用FileOutputStream也可以完成创建文件并写入,body体改为
<body>
<% String realPath = this.getServletContext().getRealPath("/"); %>
<h3><%=realPath%></h3>
<% String name = request.getParameter("filename"); String content = request.getParameter("filecontent"); String fileName = this.getServletContext().getRealPath("/") + "note" + File.separator + name + ".txt"; File file = new File(fileName); if (!(file.getParentFile().exists())) { file.getParentFile().mkdir(); } FileOutputStream fo = new FileOutputStream(file); byte b[] = content.getBytes(); fo.write(b); fo.close(); %>
</body>
结果一样。
例如:
<% Enumeration<?> enu1 = this.getServletContext().getAttributeNames(); while (enu1.hasMoreElements()) { String name = (String) enu1.nextElement(); %>
<h4><%=name%>--><%=this.getServletContext().getAttribute(name)%></h4>
<% } %>
使用config对象中的getInitParameter()方法可以取得初始化的配置参数,所有配置参数在web.xml文件中进行配置。
pageContext对象可以取得ServletRequest\ServletResponse\ServletConfig\ServletContext接口的实例
=================================================================================
编译好的class文件或jar包应该放在WEB-INF\classes文件夹中,可以根据命令
javac -d. SimpleBean.java
命令根据package的定义打包编译
tomcat安装目录的lib、WEB-INF\classes和WEB-INF\lib文件夹实际上都表示了classpath,直接将类或jar包或class文件复制到这些文件夹下即可使用
例如:
<%@page import="cn.mldn.lxh.demo.*"%>
例如:
<jsp:useBean id="simple" scope="page" class="cn.mldn.lxh.demo.SimpleBean"/>
ps:此方法省略了手工实例化对象的过程
实例:
输入表单input.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>input.html</title>
</head>
<body>
<form action="input.jsp" method="post">
姓名:<input type="text" name="name"><br />年龄:<input type="text" name="age"> <input type="submit" value="提交"> <input type="reset" value="重置"><br>
<br>
<br></form>
</body>
</html>
接收内容表单input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="cn.mldn.lxh.demo.*"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>
<body>
<% SimpleBean simple = new SimpleBean(); simple.setName(request.getParameter("name")); simple.setAge(Integer.parseInt(request.getParameter("age"))); %>
<h3>
姓名:<%=simple.getName()%></h3>
<h3>
年龄:<%=simple.getAge()%></h3>
</body>
</html>
例如:修改input.jsp接收表单全部内容
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="cn.mldn.lxh.demo.*"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>
<body>
<jsp:useBean id="simple" scope="page" class="cn.mldn.lxh.demo.SimpleBean"></jsp:useBean>
<jsp:setProperty property="*" name="simple" />
<h3>
姓名:<%=simple.getName()%></h3>
<h3>
年龄:<%=simple.getAge()%></h3>
</body>
</html>
4种设置属性操作:
<jsp:setProperty name="实例化对象的名称(id)" property="*"/>//自动匹配
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称"/>//指定对象的属性名称,自动找表单中同名名称赋值给该属性(自动匹配)
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称" param="参数名称"/>//指定参数,参数名称是原表单传递过来的参数名称
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称" value="内容"/>//指定内容
语法:
<jsp:getProperty name="实例化对象的名称(id)" property="属性名称"/>
等价于getter()方法
例如:session范围的JavaBean
在src文件夹中建立此类
package cn.mldn.lxh.demo;
public class Count {
private int count = 0;
public Count() {
System.out.println("------------一个对象产生--------------");
}
public int getCount() {
return ++this.count;
}
}
写如下页面session.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>JavaBean范围</title>
</head>
<jsp:useBean id="cou" scope="session" class="cn.mldn.lxh.demo.Count" />
<body>
<h3><jsp:getProperty name="cou" property="count" /></h3>
</body>
</html>
例如:
3.6页面改动为
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>JavaBean范围</title>
</head>
<jsp:useBean id="cou" scope="session" class="cn.mldn.lxh.demo.Count" />
<body>
<h3><jsp:getProperty name="cou" property="count" /></h3>
<%
session.removeAttribute("cou");
%>
</body>
</html>
````
运行结果:每一次显示完都会删除session对象并重新声明一个新的JavaBean
<div class="se-preview-section-delimiter"></div>
## 3.8 实例:注册认证
<div class="se-preview-section-delimiter"></div>
## 3.9 DAO设计模式
<div class="se-preview-section-delimiter"></div>
# 文件上传
<div class="se-preview-section-delimiter"></div>
## 4.1 SmartUpload
<div class="se-preview-section-delimiter"></div>
## 4.2 FileUpload
<div class="se-preview-section-delimiter"></div>
# Servlet程序开发
<div class="se-preview-section-delimiter"></div>
## 5.1 Servlet简介
Servlet(服务器端小程序)
<div class="se-preview-section-delimiter"></div>
## 5.2 第一个Servlet程序
处理HTTP请求的Servlet程序,必须继承HttpServlet类,而且自定义的Servlet类至少还要覆写HttpServlet类中提供的doGet()方法
doGet()方法中定义了两个参数:HttpServletRequest和HttpServletResponse,用来接收和回应用户的请求
示例:
用Servlet输出helloworld(实际上Servlet并不适合输出显示)
<div class="se-preview-section-delimiter"></div>
package org.lxh.servletdemo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println(“”);
out.println(“Bruce“);
out.println(““);
out.println(“
编译完成后可以将程序打包保存在WEB-INF\classes文件夹下即可,或者放在jdk目录下的jre\lib\ext中
配置web.xml文件
未完待续