第一章 Web开发基础知识(简单描述)
表单(续)
表单元素
<FORM method ="[GET|POST] action ="URL">form body</FORM>
<FORM>元素括起整个表单,并给出一些基本定义。表单仅占用HTML文档的部分空间;实际上,一个HTML文档可以包含几个独立的、完成不同功能的表单。method指定了信息传递给HTTP服务器的方法;action给出与处理提交信息的脚本相关的URL(如“registinfor.asp”,“registinfor.jsp”)。
表单输入元素
<INPUT name="text" type="string" size=## value="text" CHECKED>
¨ <INPUT >用来把不同的字段放在表单里,以便用户输入信息。
¨ name属性指定该字段在某个表单中的唯一名称;
¨ 可选的value属性给出该标记的默认值。
¨ 在提交表单时,向Web服务器呈上以一组用“?”开头并用“&”号分开的一组“名字=值”形式的信息,如http://…/Scriptname?name=me&address=here&time=now
¨ type属性给出所使用<INPUT>标记的样式,“string”可以是:
¨ CHECKBOX(复选框)。
¨ RADIO(单选按钮)
¨ TEXT(单行的文本输入栏)。
¨ IMAGE(图像放在表单里)
¨ SUBMIT(提交按钮)
¨ RESET(清除按钮)
¨ HIDDEN(在表单中保留不供显示的内容)
¨ FILE(上传文件)
第二章 Servlet开发
1.什么Servlet
Servlet是用Java语言编写的运行在服务器端的小应用程序,能够接收Web客户端的请求,并能对Web客户端进行响应,通常是通过HTTP(HyperText Transfer Protocol)协议进行工作的。(可以认为Servlet是服务器端的一个动态Java程序,用户通过访问这个程序获取服务器的服务。)
2. Servlet的主要方法
Servlet是一个Java类,通常会有3类方法,分别是:
init方法,用于初始化。
destroy方法,用于释放资源。
service方法,服务类方法,对用户的请求进行处理,并对用户进行响应,几乎所有处理功能都在这里完成。这类方法可以有多个,最常用的是doGet和doPost方法。
3. Servlet运行原理(生命周期)
n 装载Servlet:这项操作一般是动态执行。有些服务器提供了相应的管理功能,可以在启动的时候就装载Servlet,并能够初始化特定的Servlet:
n 创建过程:创建一个Servlet实例 ;
n 初始化过程:调用Servlet的init()方法 ;
n 响应服务:如果容器接收到对此Servlet的请求,那么它调用Servlet的service()方法 ;
n 销毁释放资源:实例被销毁,通过调用Servlet的destroy()方法销毁Servlet 。
2.3 Servlet运行原理
n 1.Servlet的工作过程如下
① Servlet容器接收到客户端的请求时,先判断用户所请求的Servlet对象是否存在。如果不存在,则加载Servlet类、创建Servlet对象并实例化,然后调用init方法进行初始化。② 容器创建request和response对象,并且创建一个线程,调用Servlet对象的service方法(间接调用doGet方法或者doPost方法)。
③ service方法产生响应,容器将响应发回客户端。
④ 容器销毁reqeust和response对象以及相应的线程。
n 注意:
¨ 加载Servlet类、创建对象、调用初始化方法init和销毁方法destroy都只有一次。
¨ 当Web应用被卸载或者服务器被关闭的时候,系统卸载Servlet,调用destroy方法释放资源。
n 2.Servlet的加载有两种方式:
¨ 第一次请求的时候加载。
¨ 服务器启动的时候加载。
2.4开发Servlet基本流程
开发一个Servlet程序基本包括以下几步:
(1)编写Servlet
1、引入用到的包,需要的导入的包有:javax.servlet.*,javax.servlet.http.*等
2、定义类的基本框架并继承HttpServlet
3、重写成员方法。如果需要对Servlet进行初始化,需要重写init方法。如果需要在卸载Servlet的时候执行一些功能,可以重写destory方法。一般情况下,根据需要完成的功能只需要重写服务类方法即可。服务类方法包括doGet方法和doPost方法等。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Servlet中获取参数:隐含对象Request
String request.getParamter(参数名称);
例子:
String userName=“”;
userName=request.getParameter(“username”);
System.out.println(“userName”+userName);
下面是一个具体事例:
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 HelloServlet() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String name=request.getParameter("name");
PrintWriter out = response.getWriter();
if(name!=null){
out.write("Hello"+name+"!");}
out.flush();
out.close();
}
public void init() throws ServletException {
// Put your code here
}
}
Servlet在web.xml(配置文件)
每个Servlet在web.xml中都对应一对<servlet>标签和一对<servlet-mapping>标签。其中:
<servlet>标签用于声明Servlet。其中的子标签又包括:
<servlet-name>用于声明Servlet的名字,是web.xml中内部使用的名字。
<servlet-class>标签:用于声明Servlet所对应的类名。
<servlet-mapping>标签用于进行Servlet映射。其中的子标签又包括:
<servlet-name>标签:表示Servlet的名字,需要和上面<servlet>标签的<servlet-name>子标签中声明的名字保持一致。
<url-pattern>标签:用于配置Servlet的访问地址。
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
(4)部署Servlet
n Servlet编写完成之后,需要部署到服务器才能访问,编译好的文件需要放在Web应用的WEB-INF\classes下面。
n 利用MyEclipse创建的Servlet,成功编译后其.class文件已自动放置到WEB-INF\classes目录下。
第四章 JSP基础语法
3.1 JSP的基本概念
1、什么是J S P:
Java Server Page
Java的动态网页技术,是Java Web应用开发的界面技术;
JSP是在Servlet技术基础上,为了方便页面开发的简化设计,是将Java逻辑与界面设计分开,开发更方便;
HTML中嵌入Java脚本: HTML语法的 java 扩展,加入新的标签(<%, %>,…);
2、 J S P的特点:
从技术上改进了Servlet技术,Servlet是Java代码和HTML静态代码的混合代码;而JSP是将Java代码嵌入到HTML静态代码中,直观编写简单;
JSP不需要编译(实际上是由服务器自动监测JSP文件的变化,由服务器将其翻译成Java代码后然后再进行编译并再第一次请求时创建一个Servlet实例。正因为如此,第一次访问JSP页面时会后延迟);
JSP以静态代码为主,Java代码为辅 ;功能由强大的Java语言和J2EE平台提供支持
JSP示例(Hello.jsp)
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*"%>
<HTML>
<BODY>
<%
for ( int i=0; i<2; i++ )
{
%>
你好<br>
<%
}
%>
</BODY>
</HTML>
JSP执行过程(复习)
3.2 JSP语法
语法概述
¨ JSP原始代码中包含了JSP元素和Template(模板) data两类
¨ Template data指的是JSP引擎不处理的部分,即标记<%……%>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端的浏览器
¨ JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。
jsp例子(hi.jsp)
<html>
<head>
<title>Hi-JSP实验</title>
</head>
<body>
<%
String Msg = "This is JSP test.";
out.print("Hello World!");
%>
<h2><%=Msg%></h2>
</body>
</html>
JSP语法分为三种不同的类型
编译器指令(DIRECTIVE) 例如: <%@ page import=“java.io.*” %>
脚本语法(SCRIPTING)
动作语法(ACTION) 例如: <jsp:forward>,<jsp:getProperty>,<jsp:include>
1.脚本语法
n 脚本语法包括
¨ “HTML注释”:<!— comments -->
<!-- comment [ <%= expression %> ] --> 或
<!-- 注释 [<%= 表达式 %> ] -->
这种注释发送到客户端,但不直接显示,在源代码中可以查看到。
¨ “隐藏注释”:<%-- comments --%>
<%-- 注释 --%>
不发送到客户端。
¨ “声明”
<%! declaration; [ declaration; ] ... %> 或
<%! 声明; [声明; ] ... %>
¨ “表达式”
用 于在页面上输出信息,语法格式如下:
<%= expression %> 或
<%= 表达式 %>
¨ “脚本段”
<% code fragment %> 或
<% 代码 %>
2. 编译器指令
n 编译器指令包括“包含指令”, “页指令”和“taglib指令”
n 它们包含在“<%@ %>”卷标里。
n 两个主要的指令是page与include。
include指令:向当前页中插入一个静态文件的内容。
静态文件是指文件名称不能是变量,并且不能改变
JSP 语法格式如下:
<%@ include file="relativeURL" %>
Page”指令用于定义JSP文件中的全局属性。
属性:
1.language="java"
声明脚本语言的种类,目前只能用"java" 。
2.import="{package.class | package.* },..."
需要导入的Java包的列表,这些包作用于程序段,表达式,以及声明。
n “<%@ page %>”指令作用于整个JSP页面,同样包括静态的包含文件。但是“<%@ page %>”指令不能作用于动态的包含文件,比如 “<jsp:include>”。
n 可以在一个页面中用上多个“<%@ page %>”指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和Java中的import语句类似(参照Java Language,import语句引入得是Java语言中的类),所以此属性就能多用几次。
n 无论把“<%@ page %>”指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部。
3.errorPage="relativeURL"
设置处理异常事件的JSP文件。
4.isErrorPage="true | false"
设置此页是否为出错页,如果被设置为true,你就能使用exception对象
3. 动作语法(了解)
n 动作语法包括
n <jsp:forward>
n <jsp:include>,
n <jsp:plugin>,
n <jsp:getProperty>,
n <jsp:setProperty>
n <jsp:useBean>。
3.3 JSP内置对象
JSP 有以下九种内置对象,包括:(主要是四个)
n ·request,请求对象
n ·response,响应对象
n ·pageContext,页面上下文对象
n ·session,会话对象
n ·application,应用程序对象
n ·out,输出对象
n ·config,配置对象
n ·page,页面对象
·exception,例外对象
获取参数对象:
n “request” 对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,是最常用的对象。关于它的方法使用较多的是getParameter、getParameterNames和getParameterValues(数组,循环使用),通过调用这几个方法来获取请求对象中所包含的参数的值(getAttribute、setAttribute获取数据传递到JSP)
n “response” 对象代表的是对客户端的响应,也就是说可以通过“response”对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用“out” 对象即可。
request对象示例
<html><body>
<form action="./Hello_req.jsp">
姓名<input type="text" name="UserName">
<input type="submit" value="提交">
</form>
</body></html>
Hello_req.jsp
<%@ page contentType="text/html;gb2312" %>
<%@ page import="java.util.*" %>
<HTML>
<BODY>
你好,
<%! String Name;%>
<%
Name=request.getParameter("UserName");
%>
<%=Name%>,
今天是
<%
Date today=new Date();
%>
<%=today.getDate()%>号,星期<%=today.getDay()%>
</BODY>
</HTML>
session对象
session” 对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“session” 对象建立在cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。(登录验证)
概要
¨ HTTP是无状态(stateless)协议;
¨ Web Server 对每一个客户端请求都没有历史记忆;
¨ Session用来保存客户端状态信息;
¨ 由Web Server 写入;
¨ 存于客户端;
¨ 客户端的每次访问都把上次的session记录传递给Web Server;
¨ Web Server读取客户端提交的session来获取客户端的状态信息;
session对象示例(Logon_session.html)
<html><body>
<form action="./Logon_session.jsp">
姓名<input type="text" name="UserName">
<input type="submit" value="提交">
</form>
</body></html>
<%@page contentType="text/html;gb2312" %>
<%@page import="java.util.*" %>
<HTML>
<BODY>
<%
String Name=request.getParameter("UserName");
session.setAttribute("LogName", Name);
%>
你的名字"<%=Name%>"已经写入session
<br>
<a href='./check_session.jsp'>check</a>
</BODY>
</HTML>
<%@page contentType="text/html;gb2312" %>
<HTML><BODY>
<%
String yourName=(String)session.getAttribute("LogName");
if (yourName= =null)
{
%>您还未登录
<%
}else
{
%>
"<%=yourName%>"已经登录
<%
}
%>
</BODY></HTML>
Request 和Session的作用域区别:一次请求(request) 多次请求(session)
session对象示例
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head><title>session</title></head>
<body>
<form method="post" action="post.jsp">
请输入您的姓名:
<input type="text" name="username">
<input type="submit" value="submit">
</form >
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head><title>post.jsp</title></head>
<body>
<%@ page language="java" %>
<%! String name=""; %>
<p>
<%
name = request.getParameter("username");
//将username存入session
session.setAttribute("username", name);
%>
您的姓名是:<%=name%>
<p><form method="post" action="post11.jsp">
您最喜欢的娱乐是:
<input type="text" name="amuse">
<input type="submit" value="submit"> </p>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head><title>post1.jsp</title></head>
<body>
<%@ page language="java"%>
<%! String amuse=""; %>
<%
amuse=request.getParameter("amuse");
String user=(String)session.getAttribute("username");
%>
您的姓名是: <%=user%>
您喜欢的娱乐是: <%=amuse%>
</body>
</html>
Out
“out” 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为“out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。
3.5 JSP与表单编程
n 客户端同Web服务器之间的协议为http
n HTTP为超文本传输协议
n HTPP协议为“请求和响应”协议
n 客户端请求包括:请求行、头、信息体
n 客户端请求的方法
¨ GET、POST、HEAD
n 提交表单的方法: GET、POST
n 服务器接收到请求后,返回HTTP响应
n 每个响应:状态行、头、信息体
n 常见状态
¨ 404 所请求的文件不存在
¨ 500 服务器程序出错
¨ 200 OK 成功
n 信息体用于浏览器显示
HTML表单标记:
n 表单主标记
¨ <form> </form>
n 表单中的标记
¨ <input>
¨ <select> </select>
¨ <option>
¨ <textarea> </textarea>
n <form>是表单开始标记,</form>结束
n <%--表单例子,peixun2.15.jsp文件代码--%>
n <%@ page contentType="text/html;charset=gb2312"%>
n <html>
n <head><title>表单</title><head>
n <body>
n <form method="POST" action="">
n <p align="center">用户登录
n <p align="center">
n 用户名:<input type="text" name="User" size="20">
n 密码:<input type="password" name="pwd" size="20"><br> <br>
n </form>
n </body>
n </html>
form标记
n 描述表单的特性,语法
<form method="POST" action="“ enctype=“”>
n method表单传输方法
¨ GET方法将表单信息在URL后传输
¨ POST方法将表单信息作为信息体传输
n action为表单处理方式,通常为一个URL
n enctype为编码方式
<input>标记
n 表单中输入信息的区域
n 属性
¨ type 类型
¨ name 名称
¨ id 标识
¨ maxlength 最大字符数
¨ size 输入域宽度
¨ value 域的初始值
¨ button 按钮 用javascript响应
<input>的类型
n text 文本
n passwowrd 口令方式
n checkbox 多选框 name相同(获取参数循环实现)
n radio 单选按钮 name相同
n image 图片
n hidden 隐藏表单 发送数据
n submit 提交按钮 向服务器提交表单
n reset 复位按钮 将表单充置为初始状态
n 多行文本域:<textarea> </textarea>
n 参数
n COLS:宽度
n ROWS:高度
n NAME:名称
<textarea NAME=“Computer” ROWS=6 COLS=64>
CPU PIV 1500
Memory 512M
</textarea>
下拉框:SELECT
n 定义列表框:<select> </select>
n 参数
¨ MULTIPLE 可同时选取多行
¨ NAME 名称
¨ SIZE 可见项目数
n 每个项目用option标记
n 属性SELECTED出现在option表示选中
<select name="area" style="width"50" size="1">
<option value="北京" selected > 北京 </option>
<option value="天津" > 天津 </option>
<option value="上海" > 上海 </option>
<option value="重庆" > 重庆 </option>
</select>
表单提交
n 提交方式:
¨ submit类型按钮提交表单
¨ 通过普通按钮的javascript函数
n 传输方法依据<form>中的method
¨ 推荐使用POST
n 传输编码依据<form>中的enctype
n 处理方式依据<form>中的action
<input type="submit" value=" 提交">
<%--表单综合例子,peixun2.16.jsp文件代码--%>
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head><title>表单</title><head>
<body>
<form method="POST" action="">
<p align="center">用户注册
<p align="center">
用户名:<input type="text" name="User" size="20">
密码:<input type="password" name="pwd" size="20"><br> <br>
<p>你喜欢:
<input type="checkbox" name="sports" value=football> 足球
<input type="checkbox" name="sports" value=bastketball> 篮球
性别:
<input type="radio" name="sexy" value=male> 男
<input type="radio" name="sexy" value=female> 女 <br><br>
<p>你的计算机</p>
<textarea NAME=“Computer” ROWS=6 COLS=64>
CPU PIV 1500
Memory 512M
</textarea><br><br>
<p>你计算机的操作系统
<input type="image" name="os" src="images\TURBOLINUX6.GIF">
你所在地:
<select name="area" style="width"50" size="1">
<option value="北京" selected > 北京 </option>
<option value="天津" > 天津 </option>
<option value="上海" > 上海 </option>
<option value="重庆" > 重庆 </option>
</select>
<br> <br>
<input type="submit" value=" 提交">
<input type="reset" value="全部重写"></p>
</form>
</body>
JSP中的汉字编码问题
n 表单处理涉及到客户端和服务器的完整交互过程
n 在客户端和服务器是gb2312,传输用ISO8859_1
n 在服务器端接收到客户端数据时需要转换为gb2312后进行处理,方法
name=new String(name.getBytes("ISO8859_1"), "gb2312");
n 服务器端指示客户端汉字的显示编码
<%@ page contentType="text/html;charset=gb2312"%>
举例:
<%--hanziAction.jsp--%>
<%@page contentType="text/html;
charset=gb2312"%>
<html>
<head>
<title>表单中汉字的处理</title>
</head>
<body>
<%
String name=request.getParameter("name");
name=new String(name.getBytes("ISO8859_1"),
"gb2312");
out.println("用户名:" +name+"<br>");
%>
</body>
</html>
使用JDBC编程
1.JDBC基本概念
n 什么是JDBC
¨ JDBC:Java Database Connectivity
¨ 一个独立于DBMS的接口,一个通用的SQL数据库存取框架,在各种各样的提供数据库连接模块上提供统一的接口。这使程序员可以面对单一的数据库界面,使数据库无关的Java工具和产品成为可能,使得数据库连接的开发者可以提供各种各样的连接方案
¨ 各种数据库系统软件提供相应的驱动程序
¨ Java程序就通过JDBC驱动程序与数据库相连,执行查询、提取数据等等操作。
2. JDBC 编程结构(5个类掌握概念)
n Driver类:用来与数据库通信的软件.
n DriverManager类:是JDBC基础,用来管理和卸载JDBC驱动程序.该类有一个getConnection()方法,用于验证JDBC数据源,并返回Connection对象.
n Connection类:该类的CreateStatement()方法连接JDBC数据源,返回Statement对象.
n Statement类:将SQL行为封装起来交给数据库引擎,调用该类的execute()等方法,执行SQL语句,返回resultSet对象.
n ResultSet类:封装了一个由SQL查询返回的结果.该类的getString(),getInt()等方法获得一栏数据的存取,next()方法到下一行.
//连接数据库
Connection con=null;
Statement stmt=null;
String strURL= " jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test";
try{//数据库操作的异常处理
con=DriverManager.getConnection(strURL,”sa”,”sa”);
stmt=con.createStatement();
//增加
int result=stmt.executeUpdate(“insert into stu(no,name) value(100,’张三’) ”);
//修改
result=stmt.executeUpdate(“update stu set name=‘李四’ where no=100”);
//删除
result=stmt.executeUpdate(“delete stu where no=100”);
}catch(SQLException e){
e.printStackTrace();
}finally{
con.close();
}
n 当使用Statement的executeQuery方法向数据库发送一条Select查询语句之后,返回一个ResultSet的对象,这个对象是查询结果集对象;
n ResultSet 其实就是一个二维表(行、列),并且具有列标题和对应的值。对象具有指向其当前数据行的指针。通过ResultSet对象不但可以结果集数据,还可以获取结果集表的列名、数据类型等信息;
n ResultSet res=stmt.executeQuery(sql);
ResultSet类的主要方法:
n 行指针定位方法
n public boolean next();该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方法,将会使数据库游标定位到记录集的第一行,第二次使用next()方法,将会使数据库游标定位到记录集的第二行,以此类推。
n public boolean absolute(int row);该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算,不是相对的行号。
n public boolean previous();该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。
n public boolean first();该方法的作用是将当前行定位到数据库记录集的第一行。
n public boolean last();该方法的作用刚好和first()方法相反,是将当前行定位到数据库记录集的最后一行。
n public boolean isFirst();该方法的作用是检查当前行是否记录集的第一行,如果是,返回true,否则,返回false。
n public boolean isLast();该方法的作用是检查当前行是否记录集的最后一行,如果是,返回true,否则,返回false。
//连接数据库
Connection con=null; Statement stmt=null;ResultSet res=null;
String strURL= " jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test";
try{//数据库操作的异常处理
con=DriverManager.getConnection(strURL,”sa”,”sa”);
stmt=con.createStatement();
String sql=“select id,userName,age from stu”;
int id=0,age=0;
String usename=“”;
//查询Stu表中数据
res=stmt.executeQuery(sql);
while(res.next()){
id=res.getInt(1);
username=res.getString(“username”);
age=res.getInt(“age”);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
res.close();
stmt.close();
con.close();
实例:
<%@ page import="java.sql.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>测试JSP中表格显示Stu表中数据</title>
</head>
<body>
<%
//连接数据库
Connection con=null;
Statement stmt=null;
ResultSet res=null;
String strURL= " jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test";
try{//数据库操作的异常处理
con=DriverManager.getConnection(strURL,”sa”,”sa”);
stmt=con.createStatement();
String sql=“select id,userName,age from stu”;
String username=“”;
res=stmt.executeQuery(sql);
%>
<table width=500 border=1>
<tr>
<td width=30>学号</td> <td width=50 >学生姓名</td> <td width=30 >年龄</td>
</tr>
<%
while(res.next()){
out.println(“<tr><td>”+res.getInt(1)+”</td>”):
%>
<td><%= username %></td>
<td><%= res.getInt(“age”);%>岁</td></tr>
<% }
}catch(SQLException e){ e.printStackTrace();
}finally{
res.close(); stmt.close(); con.close();
}%>
</table></body></html>
}
第五章JSP/Servlet深入编程
5.1 Servlet过滤器
什么是Servlet过滤器(过滤器作用和登录验证的流程)
n 一种特定类型的Servlet,能够拦截请求和响应,可以过滤到客户机和服务器之间交换的数据
n 过滤器介于浏览器和需要过滤的JSP、Servlet之间
n 过滤器能够接受请求响应,然后可以检查请求对象的内容,并根据情况将请求转发给下一个组件,或者中止这次请求并返回给浏览器
n 通过过滤器,对请求提交的数据统一进行编码转换,可以一次性编码解决汉字问题
5.1.2 Servlet过滤器用法
n 建立一个实现Filter接口的类,这个类需要实现3个方法:doFilter,init,destroy
n 在doFilter方法中进行过滤操作,这个方法中包含ServletRequest和ServletResponse两个对象
n 调用FilterChain对象中的doFilter方法,进行请求的传递
n 在web.xml配置文件中,对需要过滤的资源进行设置
n 使用过滤器解决登录验证– LoginFilter登录过滤程序
public class LoginFilter implements Filter {
private FilterConfig filterConfig = null;
public void doFilter(ServletRequest servletRequest,
ServletResponse servletresponse,
FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletresponse;
HttpSession session = request.getSession();
request.setCharacterEncoding("GBK");
String requestpath = request.getServletPath();
if (requestpath.equals(“/index.jsp”) {//登录页面
chain.doFilter(request, response);
}else if (requestpath.equals(“/main.jsp”) ) {//主页面
String loginUser = (String) session.getAttribute(“loginUser”);//获取令牌
if (loginUser==null){//如果没有登录,则进行用户名密码检验
String loginName=request.getParameter(“loginName”);
String password=request.getParameter(“password”);
if (“admin”.equals(loginUser) && “123456”.equals(password)) {
session.setAttribute("loginUser“,”admin”);
chain.doFilter(request, response);
}else{
RequestDispatcher dispatcher = application.getRequestDispatcher("/index.jsp");
if (dispatcher != null){
dispatcher.forward(request, response);
return;
}else{ throw new ServletException("无法创建RequestDispatcher"); }
}
}else{//其他页面
String user = (String) session.getAttribute("loginUser");
if (user == null) {
RequestDispatcher dispatcher = application.getRequestDispatcher("/index.jsp");
if (dispatcher != null){
dispatcher.forward(request, response);
return;
}else{throw new ServletException("无法创建RequestDispatcher"); }
}else chain.doFilter(request, response);
}
}
}
public void init(FilterConfig filterConfig) throws ServletException {
//设置上下文环境对象
this.filterConfig=filterConfig;
}
5.2 Servlet监听器
一种特定类型的Servlet,用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
监听器作用:
¨ 可以监听客户端的请求、服务端的操作等
¨ 通过监听器,可以自动激发一些操作,如监听在线用户数量,当增 加一个HttpSession时,给在线人数加1
¨ 可以集中代码实现对于同一个事件的处理
5.6 JSP读取CheckBox的值
n 1、显示页面
<form name="form" action="test.jsp">
<br>
你作为一个计算机专业的学生,毕业以后你可能的发展方向:
<input TYPE="checkbox" name=“job" VALUE="1"> 计算机 <BR>
<input TYPE="checkbox" name="job" VALUE="2"> 卖房子 <BR>
<input TYPE="checkbox" name="job" VALUE="3"> 当公务员 <BR>
<input TYPE="checkbox" name="job" VALUE="4"> 考研究生 <BR>
<input TYPE="checkbox" name="job" VALUE="5"> 出国 <BR>
<br>
<input name="aa" type="submit" value="提交" />
</form>
n 2、读取CheckBox数据
<%
String jobs[] =request.getParameterValues(“job");
for(int i=0;i<jobs.length;i++){
out.println(job[i]);
}
%>
第六章 Java Web开发框架
¨ 1. Model2(体系结构和模式原理)
Model 2体系结构,是一种把JSP与servlets联合使用来实现动态内容服务的方法。它吸取了两种技术各自的突出优点,用JSP生成表达层的内容,让servlets完成深层次的处理任务。在这里,servlets充当控制者的角色,负责管理对请求的处理,创建JSP页需要使用的bean和对象,同时根据用户的动作决定把那个JSP页传给请求者。特别要注意,在JSP页内没有处理逻辑;它仅负责检索原先由servlets创建的对象或beans,从servlet中提取动态内容插入静态模板。在我看来,这是一种有代表性的方法,它清晰地分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工。事实上,项目越复杂,使用Model 2体系结构的好处就越大。
Model2的工作原理
n Model2实际上就是引入了MVC设计模式,采用Servlet+JavaBean+JSP进行开发;
n 在Model 2中采用Servlet作为控制器(Controller),负责接收客户端Web浏览器发送来的所有请求,并依据处理的不同结果,转发到对应的JSP页面(Viewer)实现在浏览器客户端的显示;
n 通常在Servlet中只包含了控制逻辑和一些简单的处理逻辑,更加复杂的业务处理逻辑则借助特定的JavaBean具体实现,例如:利用JavaBean实现与数据库的连接,对数据库中的数据信息进行维护和修改等 ;
n Model 2实现了基于组件的开发。在整个软件开发过程中实现了具体清晰的逻辑划分,能够有效的区分不同的角色,这就更适合大规模系统的开发和管理 。
6.2 MVC设计模式和实现:
M是Model,表示数据模型,主要完成系统的逻辑处理。
V是View,表示用户界面视图,主要完成与用户的交互。
C是Controller,表示控制器,主要建立模型与视图之间的关联。
MVC设计模式有三部分组成:
1.模型是应用对象,没有用户界面;
2.视图表示他在屏幕上的显示,代表流向用户的数据;
3.控制器定义用户界面对用户输入的响应方式,负责把用户动作转成针对Model的操作;Model通过更新View的数据来反映数据的变化。
开发环境:Myeclipe集成的,实现的功能:
Tomcat:默认端口号:8080
WEB-INF: lib 第三方J包 配置文件 Web.xml(javaweb必须有的)
META-INF :Class (疑问)