属于B/S结构、服务器软件:Apache Tomcat、
Web 项目 目录结构:
1.src目录:存放Java源文件
2.WebRoot目录:
存在两个子目录:
META-INF目录
WEB-INF目录:(lib目录:存放驱动程序)、(web.xml文件:非常重要,不能删除)
3.其它目录(需要额外创建,例如Image目录、jsp文件)
Tomact启动验证:http://localhost:8080
部署:我这里不选择Tomcat 6.x 因为我的这个tomact太久没用了,之前不知道是不是删了什么东西,最后导致如果,就是你把你的项目部署在这个服务器上的话,它是不存在的,见下图:
点击这个查看目录是否存在,如果不存在,说明这个部署是失败的。
什么原因我也不太清楚。反正如果使用Myelicpse Tomcat去部署,你会发现,你的那个目录是存在的,所以使用上面那个来做项目。先把疑问留在这里。继续往下学习。
第一章 HTML基础
一个HTML基本上是由标签和属性构成。属性写在标签里面。
基本结构:
<html>
<head> </head>
<body> </body>
</html>
标签是可以嵌套的。空格:
疯狂记忆标签:
标题标签:<h n> </h n> n取值1~6.代表6个级别
<br> 换行标签(少见的单标签,一般标签都有</>,这种是双标签)
<p align="left"> </p> 这才是一个完整的标签。(标签+属性)
以下全部为单标签:
hr 、br
img它常用src属性。
以下全部为双标签,就只单写英文了,不写其它东西,方便记忆。
h 、 p
font 、 2<sup>5 </sup> 、 <sub>
<ul> 内含<li> 、 <ol> 内含<li>
表格标签:<table> 、 <caption> 、 <tr> 、 <th> 、 <td>
链接:a
form:<input> 背下来它的type属性值。<textarea>、<select>包含<option>、
框架:<frameset cols或rows> 、 <frame src>
以下为一些通用的标签属性:
align:对齐方式,属性值有”center、left、right“
size:宽度
width:长度,默认为页面长,可以使用百分制表示页面长度的多少。
color:颜色。#FF0000 这是三种颜色(红绿蓝)分量的组合。每个分量取值:00~FF。
bgcolor:背景颜色
border:边框宽度
width:宽度
height:高度
应用举例:
制作一个登录、注册页面。详细见书本p42上机习题。
代码分析:
<frameset rows=""> //这个是框架不能放在body标签内部,要把body删除
<a href="" target="name "> //a链接,不是src。
//!!这个注意,target会在frame框架里面选择一个name显示。
<frame src="" scrolling="auto"> //跳转链接,注意和前面的区分
<select> <option>文字 //下拉列表,option的外面就是下列列表的里面描述
<input type="button" value=" "> //value表示按钮的内容,注意和前面一个区分。
第二章 JavaScript基础 (java脚本)
JavaScript 是一种跨平台、面向对象的脚本语言,用于使网页具有交互性(例如,具有复杂的动画、可点击的按钮、弹出菜单等)。它包含一组标准对象,如 Array、Date 和 Math,以及一组核心语言元素,如运算符、控制结构和语句。核心 JavaScript 可以通过添加额外的对象来扩展,以实现各种目的。
JavaScript 最初是为了“让网页变得活跃”而创建的。这种语言中的程序称为脚本。它们可以直接写在网页的 HTML 中,并在页面加载时自动运行。脚本以纯文本形式提供和执行,不需要特殊准备或编译即可运行。
和java用法一样。也有不同点:
1.变量的声明:var //弱变量,会根据赋值的类型改变而改变。
2,函数(方法)的定义:function 函数名(参数列表){ return 值; }
//建议:都是先定义,再去使用这个函数。
(在java中函数的使用都是,先创建对象,然后通过对象.方法(函数)的方式使用它。)
JavaScript内置对象:
这里主要学习四个:
1.Window:
2.document
3.history
4.location
Window的计时器功能记一下:timer = window.setTimeout("需要运行的函数","时间ms")
document可以实现在网页上输出,最常用writeln()函数。
document对象能访问文档中的元素。例如得到文本的账号、密码。
训练:请写一个登录账号的document的脚本,当账号和密码为空时,弹出消息。
代码分析:
document.表单名.账号(密码)名.value; ///通过这种方式获取文本信息。
函数定义的方式相当于java中的void类型,所以返回写:return;
在调用这个函数的最后要写提交表单。不然就没有提交表单信息了!!!(因为在html代码里面,点击事件用的是script的函数。)
document.loginForm.submit(); //!!注意是submit()方法,不能少括号。
location对象最常用的方式是:定时跳转 比如:欢迎登录,三秒后转到首页。
用法:windows.setTimeout("toIndex","3000");
function toIndex(){
window.location.href = " "
}
主要部分:JSP编程
第三章:JSP基本语法
JavaServer Pages (JSP) 是一种技术,它允许开发人员使用 HTML、XML 和 Java 代码的组合来创建动态网页。JSP 页面在 Web 服务器上执行,生成的输出发送到客户端的 Web 浏览器。
JSP 是 Java 企业版(Java EE)的一部分,用于构建支持动态内容的 Web 应用程序。JSP 文件本质上是带有一些额外语法的 .html 文件,有两个小的初始差异:.html 后缀被替换为 .jsp(它被认为是 .jsp 文件类型),并且在 .html 标记元素的顶部添加了以下标记:<%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %>。
它的优点是:在客户端(网页开发工具)看不到源代码。凡是以<% 内容 %>,在客户端都看不到内容。
JSP表达式:< % = 变量/返回值/表达式 % > (这种表达式,一次只能出现单行。一般用的还是JSP程序段)
作用是将里面的内容所运算的结果传输到客户端。
凡是没有加<% % >都被称为HTML代码。
JSP声明:<% ! % >
<% ! String str="欢迎!" %>
JSP有关的URL传值:
String str = request.getParameter("number"); //这个能获取URL的参数。必须要加"".!
int number = Integer.parseInt(str); //传输的参数是字符串,必须进行强转换。
代码分析:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"”%> //就因为在这里多了一个"导致错误。无语!!!,但是它是到运行的时候才给我抛出异常,先记住一下这个异常:
<a href="index.jsp?number=<%= number %>">toindex</a> //记一下这种方式,<% %>表达式可以作用在字符串里面。
JSP指令:
<% @ 指令类别 属性=”属性值“ %>
前面的:<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
在程序的第一段就是指令。
指令类别有三种,这里我们只介绍两种:page和include.
page指令是用的最多的。
它可以导入包:page import=" "
可以设定字符集:page pageEncoding=" "
可以设定MIME类型和字符编码(其实用途和上面那个设定字符集一样。):
contentType = " text/html ; charset= gb2312 " //注意区别,只有一个” “。
JSP动作:
<jsp: 动作名 属性=”属性值“> </jsp:动作名> //注意区分前面。
第四章:表单开发
以用例举例来说明:书本P97,第五题。
代码分析:
1.<script type="text/javascript"> 类型里面:
//误区:account="" 这个字符串里面不能有空格
if (account == "") {
alert("账号不能为空");
return;
}
2.<form>里面。
<!--误区:这个type只能是button,不能是submit类型。因为它现在还没有进行提交。要判断之后才可以-->
<input type="button" οnclick="fun()" value="登录">
3.<form action= method= > 里面的<input >
<!--误区:可以使用隐藏表单来接收上一个jsp的账号 -->
<input type="hidden" name="account" value="<%=account%>">
4. <% %>表达式里面。
<%
//在需要获得中文的那个页面输入此行。所以main.jsp不需要转换。
request.setCharacterEncoding("gb2312");
完整代码:login.jsp 提交给 main.jsp 提交给 show.jsp
第五章 JSP访问数据库
JDBC(Java Database Connectivity)是一个用于连接和执行数据库查询的API。JDBC可以与任何数据库一起使用,只要提供了适当的驱动程序。
java.sql包提供了用于访问和处理数据的API,通常存储在关系数据库中。这个API包括一个框架,可以动态安装不同的驱动程序以访问不同的数据源。
使用JDBC连接和操作数据库的步骤:(在JAVA学习第四步讲过一点)
1.手动添加JDBC驱动程序。
2.注册JDBC驱动:Class.forName();
3.建立数据库连接:Connection con = DriverManager.getConnection(url,user,password);
4.使用java.sql包的接口(类Statement)去运行SQL语句:
Statement stat = con.createStatement();
stat.executeQuery(sql语句); //查询方法
通过创建ResultSet对象来获取结果:ResultSet rs = sql.executeQuery();
5.关闭数据库连接。stat.close; co.close;
(第一步手动添加不记,我们在写代码的时候,牢记四步走。)
注意一下在jsp程序里面和在Java程序里面的使用流程是一样的。但是Java程序里面多了很多个try ---catch语句。
疯狂记忆SQL语句(前面Java学习里面学过了一遍):以t_student为例。
查询操作(稍微复杂了一些):select 字段 from 表名 where 条件(可以用like ‘%%’匹配)
select stuno,stuname from t_student where stusex = '男';
更新操作:update 表 set 字段 = 新值 where <条件子句>
update t_student set stusex = ‘女’ where stuno = '001';
添加操作:insert into 表(字段列表) values (对应的具体的记录)
insert into t_student(stuno,stuname,stusex) values('006','dada','男');
删除操作:delete from 表名 where 条件
delete from t_student where stuno='005';
注意区分一些细节的地方。
通配符的使用,其实就是PreparedStatement的使用:
基本上都使用在添加操作:
更换前面第三步的方法:PreparedStatement ps = con.PreparedStatement(sql语句);
ps.setString(1,stuno); //设置第一个问号的值。
事务的介绍:
三步走:1.使用setAutoCommit(boolean b)方法关闭自动提交模式
2.用commit()方法处理事务
3.用rollback()方法处理事务失败。
应用举例:书本P111。处理登录事件。
代码分析:
第一个误区:
。一直报错没有找到驱动程序,但是,后面我使用以前成功的例子发现是可以运行的。那就是驱动程序无误。可能错误在连接那里,或者我没有保存,也有可能是格式问题(都是我的猜想。)最后我通过复制粘贴了这两句并保存,结果就没有出现问题。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
第二、三个误区:
//误区:以为只能使用while才能提取信息。其实使用if语句也可以遍历获得那些数据。
if (!rs.next())
out.print("不存在账号");
else {
String paswd = rs.getString("password");
//误区:不能使用paswd==password ,字符串相等这里的方法注意一下,不能用==。
if (paswd.equals(password))
out.print("登录成功");
else
out.print("登录失败");
}
第三个误区:
一开始,我的尝试是想把登录成功的代码全部都写进login界面,放入JavaScript程序段里面,但是出现问题。可能是可以的,但是,我没想出来。所以最后还是用了两个界面来完成这个问题。
第六章:JSP内置对象
内置对象是指在JSP页面中内置的不需要定义就可以在网页中直接使用的对象。
这本书只介绍九种内置对象。
JSP中一共预先定义了9个内置对象,分别为:**request**、**response**、**session**、**application**、**out**、**pagecontext**、**config**、**page** 和 **exception**。这些对象在客户端和服务器端交互的过程中分别完成不同的功能。
- **request对象**: 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。
- **response对象**: response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
- **session对象**: session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
- **application对象**: application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
- **out对象**: out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
- **pageContext对象**: pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
- **config对象**: config 对象的主要作用是取得服务器的配置信息。
- **page对象**: page 对象代表JSP本身,只有在JSP页面内才是合法的。
- **exception对象**: exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
1.out对象:out.print()
2.request对象:request.getParameter()
HTTP Status 的错误:
404 //Not Found ,无法找到指定位置的资源
500 //Internal Server Error ,服务器遇到无法预料的情况,不能完成客户的请求。
3.response对象:重定向
response.sendRedirect(目标页面路径,可以是外部网站这种);
对比于JSP动作指令:<jsp::forward page="只能是同一Web应用程序内部的资源" > </jsp:forward>
4.Cookie操作:
页面传指的方式前面介绍了:URL传指、隐藏表单。现在加一个Cookie操作。因为URL传指会被看见数据。Cookie和表单一样,也可以解决这个问题。但是实质还是不够安全。
代码分析:
//误区:原来验证账号可以在sql的判断语句进行,这样就减少了大量的代码量!
String sql = "select * from login where account='"+account+" ' ";
//误区:rs.next()必不能少,这个是游标的关键,哪怕只有一行,也不能少这个。
if (rs.next()) {
5.session对象(单独做一个段)
常用session对象开发购物车。
它对应的类(接口)是javax.servlet.http.HttpSession
API接口类型:
添加方法:session.setAttribute(String name,Object obj);
读取方法:session.getAttribute(String name);
移除方法:session.removeAttribute(String name);
全部清除方法:session.invalidate();
应用举例:添加购物车,两个或者一个页面,实现添加商品,删除商品。书本P137第一题。
代码分析:
第一个问题:表单的问题,一开始我的想法是新建一个数据库,用数据库里的内容来显示,但现在的只是储备量有点低,到后面就有点复杂,就放弃了。然后下面这种html的基础请记一下。
原先尝试的:这里的booname、price是通过数据库连接获得的。
标准答案:
<table>
<tr>
<th>历史图书</th>
<th>图书价格</th>
</tr>
<tr>
<td>近代史</td>
<td>价格23元</td>
<td><a href="buy.jsp?a=近代史 价格23元">购买</a></td>
<td><a href="del.jsp?a=近代史 价格23元">删除</a></td>
</tr>
第二个问题:
//这个很重要,每一次都需要用它检测是否获取到books的数据
ArrayList<String> books = (ArrayList<String>)session.getAttribute("books");
第三个问题:(三个点)
//误区:每一次跳转到这个jsp内,都会调用一次这个方法。所以必须把这个初始化创建空间放在一个条件里。
if(books == null){
//误区:初始化books不能放在这里面,因为外面的条件也用到了books.那么就需要一个得到它。
books = new ArrayList<String>();
session.setAttribute("books",books);
}else{
//误区:我也不知道为什么要使用iso-8859-1。在前面表单里面明明说的是gb2312才是中文支持的。
book = new String(book.getBytes("iso-8859-1"));
books.add(book);
}
第四个问题:
//误区,以为获得books是String的方式,注意了,它是一个ArrayList类型
ArrayList<String> books = (ArrayList<String>)session.getAttribute("books");
第五个问题:
String book = request.getParameter("a");
//误区:请记住这种用法,转换为中文形式
book = new String(book.getBytes("ISO-8859-1"));
//误区:注意后面括号的是一个字符串,需要加双引号,否则会报错。
ArrayList<String> books = (ArrayList<String>)session.getAttribute("books");
第六个问题:
//误区:注意删除指定的书本,可以加个if语句去判断。这个方法记一下。(要注意它们的编码方式要相同才会得到相等噢)
if(book.equals(a)){
//误区:一是没有加break,那么它会一直循环直到结束。二是删除,只删掉了books里的集合,但是session里面的并没有删除。
books.remove(i);
session.setAttribute("books",books);
out.print("已经删除此本书");
flag=true;
break;
}
//误区:因为是在一个循环里面,如果你加了这个语句,那么它只会从头开始顺序删除,就无法进行遍历。所以不能使用else。
//else{
//out.print("购物车里没有这本书,无法进行删除操作");
6.application对象(单独做一个段)
跳过,书本P134.