第一讲(参考《Java Web程序设计基础教程》第1章)
1 JSP 和 Java的关系
一般Java指的标注版 Java SE
另外两个版本:Java EE 和 Java ME
JSP属于Java EE的一部分。
Java EE:
组件:Web层组件(JSP+Servlet)+业务层组件(EJB)
服务:JNDI JDBC RMI JAAS JavaMail等等
Java EE包括2个体系:标准(上面介绍的)+流行(Struts+Hibernate+Spring)
两套体系都是JSP+Servlet为基础。
2 JSP会涉及哪些内容
JSP语法基础(Java+HTML):
对于Java,需要掌握Java的基本语法(类定义 对象定义和使用 常用类库java.lang.*,java.util.*)
对于HTML,主要表单元素(输入)+表格(显示信息)+基本HTML
JSTL,标准标签库,用于输出和控制
EL,通常与JSTL一起使用,主要用于输出
Servlet,几乎所有介绍JSP的书和课程都包含Servlet,因为JSP实际上指的是Java Web开发。用Servlet主要是控制器。
JDBC,对数据库的访问。
JavaBean(Java类)
3 JSP的运行环境
JDK
服务器:我们用Tomcat。其它的服务器:IBM Websphere + BEA WebLogic + JBoss(免费的) + GlassFish(新出的Java EE 5服务器)
4 JSP的开发环境
页面:DreamWeaver开发页面
代码:本文编辑器 Eclipse NetBeans JBuilder
注:我们采用记事本。
5 Tomcat文件夹
webapps 主要各个应用,编写的每个应用(网站)都可以放在这个位置
bin 这个是启动服务器的相关文件,tomcat6用于命令行方式的启动,tomcat6w用于windows方式的启动
conf 用于配置,常用的是server.xml 另外一个是web.xml
work 存放临时文件
logs 系统运行时候的日志信息
6 实例:hello.jsp
创建一个应用,实际上需要在webapps中创建文件夹,bookstore,相当于应用的名字
文件夹中要创建一个子文件夹WEB-INF,这个每个应用web应用都需要的。
在WEB-INF中需要web.xml,是web应用的配置文件,还应该有classes和lib子文件夹(存放类文件)
JSP文件和HTML文件直接放在bookstore下面。
hello.jsp文件内容如下:
<%@ page contentType="text/html;charset=gb2312"%>
先启动服务器:
访问程序:http://127.0.0.1:8080/bookstore/hello.jsp
http表示协议
127.0.0.1表示主机IP地址,也可以写主机名字
8080表示服务的端口,上网的时候不用输入端口,因为采用了默认的端口,默认端口80。
bookstore表示应用,是应用的名字
hello.jsp就是资源
7 JSP的运行原理
过程:
首先启动服务器,并且要保证应用在服务器上(把应用放在webapps下面,会自动加载)
在客户端通过浏览器发送请求(在地址栏中输入地址)
服务器接收到请求之后,查找有没有这个文件对应的Java文件的对象。如果没有这个对象,需要创建(先把JSP文件转换成Java文件,
编译成.class文件,加载类并创建对象),然后调用对象的相应方法,方法完成对用户的响应,通常是输出的html代码)
客户端接收到的是html代码,浏览器解析这个代码生成页面。
8 表格的语法
开始标志:
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第一讲结束************************************************
***********************************************************************李老师的一亩三分地******************
第二讲(参考《Java Web程序设计基础教程》第2章)
1、form
只要是涉及向服务器提交信息,都应该使用form。
基本语法结构:
2、常用的表单元素
单行文本框:用于输入少量的信息。
基本语法格式:
type="text"就说明这是单行文本框;
name指出文本框的名字,最好不要用汉字,最好使用有意义的名字;
value指出默认值,如果没有默认值,可以不要value属性,value属性经常在修改的时候使用。
注意:如果有格式要求,要明确的告诉用户。
密码框:用于输入密码。
基本的语法格式:
注意:设置密码的时候,应该使用确认密码,应该有两个密码框。
提交按钮:当点击它的时候,会把输入的信息提交给服务器。
基本语法格式:
type应该为submit,value是显示在按钮上面的信息。
复位按钮:当点击它的时候,会把各个表单元素的值恢复到默认值。
基本语法格式:
普通按钮:也可以完成提交,还可以完成方法的调用。
基本语法格式:
单选按钮:通用用于在多个选项中选择一个。
基本语法格式:
这个表示一个单选按钮,并且仅仅是一个按钮。
例,选择性别:
男
女
如果希望在多个选项中选择一个(有互斥性),必须让他们的名字一致。
复选框:用于多选。
基本的语法格式:
显示给用户的信息与提交给服务器的信息没有关系。
如果希望多个选项是一组,应该使用相同的名字。
下拉列表:用于选择,可以单选,也可以多选。
基本语法格式:
每个选项使用一个option,使用value属性指出该选项的值,在之间是显示给用户的值。
文本域:用于输入大量的信息。
基本语法格式:
要为这个文本域赋默认值,需要把值放在开始标志和结束标志之间,而不是使用value属性。
3、完成输入的时候应该注意的问题
对格式的要求必须明确,包括长度、数字、日期、email、电话、必添。
能够从系统中获取的信息不要让用户提供,例如当前时间。
能够选择的信息不要让用户输入。
按照信息的重要程度安排表单元素在界面中的位置。
4、对用户输入信息进行验证
要用JavaScript,使用下面的标记:
要写方法
function check(){
}
方法可以不用定义返回值,但是可以有返回值
获取用户输入的值:
document.form1.username.value
document表示当前文档,form1表示表单的名字,username表示该表单中表单元素的名字,value表示得到值
把表单提交与方法关联:可以使用表单的onSubmit事件。
onSubmit="return check();"
例:
使用button的onClick事件进行验证:
首先要把提交按钮修改成普通按钮;
在普通按钮上增加事件:onClick="javascript:check()"
在验证成功的时候,提交表单:document.form1.submit();
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第二讲结束************************************************
***********************************************************************李老师的一亩三分地******************
第三讲(参考《Java Web程序设计基础教程》第3.4章)
1、include指令
作用:把多个文件中需要共享的代码放在单独的文件中,然后在需要的时候使用该指令引入这个文件。典型的应用,把网站的头部和版权信息放在单独的文件中,在其他文件中包含这两部分。
基本的语法格式:
<%@ include file="目标文件"%>
file属性指出目标文件。
例:把index.jsp和register.jsp中的共同部分做成单独的文件header.jsp(后缀名不一定是.jsp),然后在index.jsp和register.jsp中调用。
header.jsp中的内容如下:
<%@ page contentType="text/html;charset=gb2312"%>
电子书店 | ||
注册 最新图书 最畅销图书 查询图书 修改密码 查询订单 购物车 | ||
|
2、
我们使用登录功能的模拟来介绍。
首先,使用Java代码完成判断,使用
<%@ page contentType="text/html;charset=gb2312"%>
<%
// 先获取用户输入的用户名和口令,然后判断是否合法
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
if(username.equals("zhangsan") && userpass.equals("zhangsan"))
{
%>
<%
}else{
%>
<%
}
%>
注意:不管跳转到success.jsp还是index.jsp,地址栏都是处理文件的名字。
page属性指出转向的目标文件。最后的结束符为“/>”,斜杠不能省略。
另外一个可以完成跳转的方式是采用response.sendRedirect()。response和request一样,都是内容对象,可以直接访问。修改上面的文件:
<%@ page contentType="text/html;charset=gb2312"%>
<%
// 先获取用户输入的用户名和口令,然后判断是否合法
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
if(username.equals("zhangsan") && userpass.equals("zhangsan"))
{
response.sendRedirect("success.jsp");
}else{
response.sendRedirect("index.jsp");
}
%>
相同点:都是转向目标文件。
不同点:地址栏中显示的内容是不相同的,如果使用
使用
index.jsp中输入用户名和口令,提交给login_process.jsp,服务器保存用户的输入信息,使用
使用response的请求:
index.jsp中输入用户名和口令,提交给login_process.jsp,服务器保存用户的输入信息,使用response的sendRedirect方法相当于重新向服务器发送一次请求,这样上次的请求内容(用户名和口令)就不能共享了。
3、
把index.jsp中<%@ include="header.jsp"%>替换成
从运行效果上相同。
不同点:1、两个文件,目标文件是单独运行的,当前文件运行到
2、<%@ include%>指令是在编译(转换)的时候使用,
程序中如何选用:要导入的内容是不是每次都执行,如果每次都执行的话,应该使用<%@ include%>,如果是在特定的条件下,应该使用
4、
把login_process.jsp中的
<%@ page contentType="text/html;charset=gb2312"%>
<%
// 先获取用户输入的用户名和口令,然后判断是否合法
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
if(username.equals("zhangsan") && userpass.equals("zhangsan"))
{
%>
<%
}else{
%>
<%
}
%>
运行效果是相同的。但是有不同点,修改代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
处理文件的前半部分
<%
// 先获取用户输入的用户名和口令,然后判断是否合法
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
if(username.equals("zhangsan") && userpass.equals("zhangsan"))
{
%>
<%
}else{
%>
<%
}
%>
处理文件的后半部分
两次运行结果不相同。
分析原因:
5、使用标准标签库(JSTL)完成登录的判断过程
如何使用标签标签库:(1)得到标签库的实现文件,jstl.jar和standard.jar,放在WEB-INF下面的lib子文件夹。(2)在JSP文件中要声明标签库,通过tablib指令进行声明:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> (3)使用标签:
要完成判断,可以使用标签标签库中的c:if标签。标签的基本格式:
test表示测试条件,测试条件可以写常量,可以是表达式语言(EL,主要用于输出),主要使用表达式语言。
例如:要判断用户提交的用户名和口令是否是zhangsan。
注意:添加完标准标签库之后,需要重新启动服务器。
6、使用session保存登录后的信息
在网站中设置了application session request pageContext对象保存内存中的信息。application是网站所有用户共享的存储变量的位置。session是网站为每个访问网站的人创建的,每个用户对应一个session,也是存放变量的位置。request是为每个用户的每次请求设置的存储信息的位置,每次访问会有一个request。pageContext是每次访问的每个页面对应一个。常用的session和request。多次访问之间要共享信息可以使用session,如果在某次访问的多个页面之间共享信息使用request(例如,使用jsp:forwrad转向的文件和当前文件就属于同一次请求)。
登录后的用户信息应该放在session中。
要在这些范围中保存信息,可以使用标准标签库中的
要把用户名放到session中:
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第三讲结束************************************************
***********************************************************************李老师的一亩三分地******************
第四讲(参考《Java Web程序设计基础教程》第6章)
1、对Servlet的理解
Servlet是一种Java类。
Servlet能够完成与JSP相同的功能。能够接收用户的请求,能够调用功能类的方法,可以对用户进行响应。
Servlet和JSP同属于Java EE中Web层组件。
2、如何编写一个Servlet
假设:该Servlet的功能为显示欢迎信息。
Java文件的编写过程:(1)声明包 (2)引入用到的其他的类 (3)类的编写
对于类:(1)类头——修饰符 class关键字 类名 继承父类 实现接口
(2)类体——成员变量 构造方法 对属性进行操作的方法 功能类方法
对于成员变量:修饰符 类型 变量名(对象名)
对于方法(不包括构造方法):修饰符 返回值类型 方法名 参数列表 异常列表 方法体
对于方法体:变量的声明 各种运算 调用其他的方法 返回结果
(1)声明包,假设包名为servlet
package servlet;
(2)引入用到的类,javax.servlet.* javax.servlet.http.* java.io.*
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
(3)类头的定义
访问控制符:public
类名:HelloServlet
继承父类:javax.servlet.http.HttpServlet
实现接口:没有要实现的接口
public class HelloServlet extends HttpServlet
(4)方法的定义
主要的方法:init方法(用于初始化) destroy方法(释放资源) doGet或者doPost(完成主要功能)
通常主要实现doGet方法或者doPost方法,分别对应客户端的get请求和post请求。
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
// 设置编码方式
response.setContentType("text/html;charset=gb2312");
// 得到输出流对象
PrintWriter out = response.getWriter();
out.println("欢迎学习JSP!");
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
doGet(request,response);
}
3、编译存放
需要用到javax.servlet.*和javax.servlet.http.*,两个包的实现在tomcat下面的lib中,名字为servlet-api.jar。
放在(编译后的Servlet):WEB-INF/classes
配置path: 把C:/Program Files/Java/jdk1.6.0/bin添加到path中,但是不能破坏原有的路径。
配置classpath:把C:/Program Files/Apache Software Foundation/Tomcat 6.0/lib/servlet-api.jar;添加到classpath中。
编译:在命令行方式下进入到classes目录,然后使用 javac -d . HelloServlet.java -d表示生成包的路径,.表示在当前位置生成。
4、配置Servlet
配置文件及位置:WEB-INF下面的web.xml。
配置包括两个方面:Servlet的声明 以及 Servlet访问方式的声明
Servlet的声明:
其中,
Servlet访问方式的声明:
其中,
5、访问Servlet
http://127.0.0.1:8080/bookstore/hello
6、用Servlet完成login_process.jsp的功能
login_process.jsp主要功能,判断用户输入的用户名和口令是否合法,然后根据判断的结果选择界面对用户响应。
对于JSP文件来说,优势在于显示信息,login_process.jsp中的代码都不是显示信息的,主要用于控制。在Java Web应用中存在大量的这种现象。是Java Web中的控制功能。主要使用Servlet完成控制。
login_process.jsp的基本功能:获取用户的输入信息;进行判断;转向。
如果使用Servlet完成,功能代码应该写在doGet或者doPost方法中。对应上面的3个功能分别实现如下:
获取用户信息:用户信息存储在doGet或者doPost方法的第一个参数中,所以从参数中获取,获取的代码为
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
判断:
if( username.equals("zhangsan") && userpass.equals("zhangsan") )
转向响应界面:
第一种方式:response.sendRedirect("index.jsp");
第二种方式:与
RequestDispatcher rd = request.getRequestDispatcher("index.jsp"); // 参数是要转向的页面
rd.forward(request,response); // 完成跳转
LoginProcessServlet.java代码如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginProcessServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
// 获取用户输入的信息
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
if( username.equals("zhangsan") && userpass.equals("zhangsan") )
{
RequestDispatcher rd = request.getRequestDispatcher("success.jsp"); // 跳转到成功的页面
rd.forward(request,response); // 完成跳转
}else
{
RequestDispatcher rd = request.getRequestDispatcher("index1.jsp"); // 跳转到登录页面
rd.forward(request,response); // 完成跳转
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
doGet(request,response);
}
}
配置文件中添加如下代码:
修改index1.jsp的代码(修改form所在行),修改前:
M部分:
从ArrayList对象cart中删除Item对象item:cart.remove(item) cart.remove(i)
修改功能:在添加过程中如果要添加的图书已经存在,就相当于修改。
C部分:与添加功能中的代码非常类似。
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第九讲结束************************************************
***********************************************************************李老师的一亩三分地******************
第十讲
1、MVC模式分析
对任何功能来说,首先考虑人如何来使用这个功能。如何把人的请求发送给系统,系统如何把处理的结果返回给用户,实际上就是输入和输出。输入MVC模式中的V部分。
输入:用户发送请求,通过超链接,通过浏览器的地址栏,通过表单提交。请求时候如何要提交数据,在超链接中以及地址栏中可以通过?的形式来传递值,表单方式通过表单元素提交信息。非常典型的应用,隐藏域,用于在多个页面之间传递信息。注意:输入一定要进行客户端的格式验证。
输出:主要服务器得到的信息显示给用户。输出提示信息:${info} 输出对象信息:在更新界面中显示信息${book.bookid} 输出多个对象的信息:
${book.bookid}
${book.bookname}
${book.author}
${book.price}
${book.publisher}
删除
修改
添加到购物车
功能(M部分):通常转换成方法。因为Java是面向对象的语言,方法应该输入某个类的。所以通常需要创建JavaBean(比较特殊的类),然后在JavaBean中添加这个方法。方法的实现主要依赖你的Java基本功。
控制器(C部分):通常使用Servlet来实现。对于控制器需要记住4句话:获取信息;调用JavaBean;保存信息;响应。
获取信息:
获取请求信息request.getParameter(paraname) request.getParameterValues(paraname)
获取session中信息 session.getAttribute(属性名) 注意:获取到之后需要进行强制类型转换
获取Cookie中信息 request.getCookies() 返回的是Cookie数组
获取请求头信息
获取Servlet的配置信息
通过其他的JavaBean来获取一些信息
调用JavaBean的方法:
实例化,使用new加上构造方法来实例化,如果要调用的方法是静态方法,不需要实例化。
初始化,可能需要使用上面获取的信息来对JavaBean进行初始化。
调用方法,可以通过参数传递需要的信息
保存信息(主要为后续的页面和处理服务的):
保存到session中,session.setAttribute(属性名,要保存的对象),供用户后续的所有访问过程使用。
保存到request中,request.setAttribute(属性名,要保存的对象),供后续页面使用(页面与当前的Servlet属于同一次请求)
保存到cookie,Cookie cookie = new Cookie("name","value"); response.addCookie(cookie); ,供客户端在以后的时间访问
响应:
直接输出:
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("欢迎学习JSP!");
使用专门的文件进行响应:
方式一:
RequestDispatcher rd = request.getRequestDispatcher(目标文件);
rd.forward(request,response); // 完成跳转
方式二:
response.sendRedirect(目标文件);
注意:如果当前功能完成的是对数据库的插入操作,如果用户刷新就会产生错误。要避免错误,不能使用RequestDispatcher,可以使用方式二。如果使用方式二,就不能在当前文件和目标文件之间通过request共享信息了。如果要共享可以session,使用session的时候,用完之后一定要删除这个对象session.removeAttribute(属性名)。
2、如何使用其他的数据库管理系统
准备工作:
1)安装数据库;创建表。(这个过程通常是由数据库管理员完成的,对于变成人员来说需要知道数据库的IP地址、端口、数据库名字、用户名、口令)。
2) 要得到数据库的JDBC驱动程序,通常是压缩包,可以从响应的数据库提供商的网站上下载。需要把驱动程序放在:C:/Program Files/Apache Software Foundation/Tomcat 6.0/lib 或者 应用的WEB-INF/lib下面。
在程序中使用:
与现在使用JDBC-ODBC桥方式基本相同,不同点在于:驱动程序的名字;URL(通常包含IP地址、端口、数据库名字)的格式不同(与驱动程序有关);用户名和口令。
常见的错误:
1)ClassNotFoundException 通常是因为JDBC驱动程序加载失败,找不到。确认JDBC驱动程序在正确的位置以及版本是否正确。
2)没有合适的驱动程序 Not a suitable driver 通常是因为URL的格式不正确。
3)连接不能被创建,数据库服务器没有正常运行获取主机、端口、数据库名有误。
4)Access Denied 用户名和口令错误
5)java.sql.SQLException 通常SQL语句错误。
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************全十讲结束************************************************
***********************************************************************李老师的一亩三分地******************