目录
- 一、JSP简介(Sun公司开发)
- 二、JSP语法
- 三、JSP内置对象(不需要声明就可以使用)
- 四、JavaBean
- 五、Java Servlet(在服务器创建能响应用户请求的对象)
- 六、MVC模式
- 七、JSP中使用数据库
一、JSP简介(Sun公司开发)
JSP特点
与平台的无关性。
动态页面与静态页面分离。
Tomcat 相关
Tomcat是一个JSP引擎(统一管理并运行jsp的web应用程序)。
安装了JSP引擎的计算机被称为JSP服务器。
测试Tomcat是否能启动成功:打开bin/startup.bat后,输入localhost:8080(或者127.0.0.1)
修改Tomcat端口:打开conf/server.xml,修改Connector标签下的port
当修改为80时,网址可以不输入“:80”(80是http默认端口)
部署jsp项目:将整个工程文件放入webapps下
访问jsp项目:localhost:8080/工程名/jsp名
当单个的jsp放在Root目录下时,可以不用输入包名直接访问,即localhost:8080/jsp名
可以在conf/server.xml下修改jsp目录而不用放在webapps下
<Context path="路径名" docBase="项目的绝对路径" debug="0" reloadable="true"/>
JSP原理
jsp引擎把jsp页面转译为java文件,java文件通过编译后生成字节码文件(.class),用字节码文件响应用户需求。
当多用户访问同一jsp时,Tomcat服务器会为每一个用户开一个线程。
1.处理html标记符号并显示
2.处理jsp标记
3.处理“<%”、“%>”之间的java程序片并显示
二、JSP语法
JSP页面组成
1.普通的HTML标记符
2.JSP标记
3.变量、方法<%! %>(定义的变量与方法在整个jsp内都有效(全局变量、全局方法))
4.java程序片<% %>(定义的变量为jsp页面的局部变量)
5.java表达式<%= %>("<%="是一个完整的符号,以字符串形式返回)
JSP注释
HTML注释:<!-- 注释内容 -->
JSP注释:<%-- --%>
JSP指令标记
page(可以不放在开头!只是出于可读性)
多种属性:<%@ page 属性1="XXX" 属性2="XX" ...%>
单条属性:<%@ page 属性="xxx" %>
contentType(响应类型、字符编码)
用HTML解析器执行:<%@ page contentType="text/html;charset=UTF-8"%>
用本地MS-word执行:<%@ page contentType="application/msword" %>
默认值:"text/html ; charset=ISO-8859-1",不允许多次给contentType指定不同的值!
language(JSP使用的脚本语言)
<%@ page language="java" %>
import(声明包、类)
多个import:<%@ page import="XXX", "XXX" %>
单个import:<%@ page import="XXX" %>
JSP页面默认import属性:"java.lang.*"、"javax.servlet.*"、"javax.servlet.jsp.*"、"javax.servlet.http.*"
session(是否需要session,默认是true)
<%@ page session="true/false" %>(true时可以使用session)
buffer(out的缓冲区大小,默认8kb,也可以设置为none,即不使用)
eg:<%@ page buffer= "24kb" %>
autoflush(out缓冲区被填满时是否自动刷新,默认为true)
当该值为false时,如果out缓存区填满,就会出现缓存溢出异常。
当buffer的值为none时,autoflush只能是true。
isThreadSafe(是否可多线程访问,默认为true)
若isThreadSafe为false时,其他用户只能排队等待。
info(为jsp准备一个常用且经常修改的字符串)
<%@ page info= "we are students" %>
调用getServletInfo()
errorPage(若该页面有exception则显示,默认是false)
<%@ page ErrorPage="true"%>
isErrorPage(其他 JSP 页面的错误页面,默认是false)
<%@ page isErrorPage="true"%>
include(静态插入文件,不会被编译器执行)
<%@ include file= "文件的URL " %>
JSP动作标记
include动作标记(动态插入文件,运行时才将文件加入,会被编译器执行)
<jsp:include page= "文件的URL"/>
或者 <jsp:include page= "文件的URL">
param子标记
</jsp:include>(将param的值传给文件里)
param 动作标记(name-value,类似map)
<jsp:param name= "名字" value= "指定给param的值"/>
forward 动作标记(跳转页面)
<jsp:forward page="要转向的页面" />
或
<jsp:forward page="要转向的页面" >
param子标记
</jsp:forward> (将param的值传到页面)
useBean动作标记(创建并使用JavaBean)
JSP脚本元素
变量、方法<%! %>(定义的变量与方法在整个jsp内都有效(全局变量、全局方法))
java程序片<% %>(定义的变量为jsp页面的局部变量)
java表达式<%= %>("<%="是一个完整的符号,以字符串形式返回)
三、JSP内置对象(不需要声明就可以使用)
request对象(用户->服务器,封装用户提交信息)
信息编码:request.setCharacterEncoding("UTF-8");
getProtocol():获取用户向服务器提交信息所使用的通信协议
getServletPath():获取用户请求的JSP页面文件的目录。
getContextPath():获取用户请求的当前Web服务目录
getRemoteAddr():获取用户的IP地址。
getRemoteHost():获取用户机的名称(如果获取不到,就获取IP地址)
getServerName():获取服务器的名称
getServerPort():获取服务器的端口号
HTML标记
< form >
<form action= “JSP页面” method="get/post">
提交手段
</form>(用request.getParameter()获取)
使用get方法提交的信息会在提交的过程中显示在浏览器的地址栏中
post方法提交的信息不会显示在地址栏中
提交的内容可以是文本框、列表、文本区。
< input >
<input type="输入对象的GUI类型" name= "名字"/>
文本框text:<input type="text" name="me" value="hi"/>
单选框radio:<input type="radio" name="rad" value="red" checked="java" />
复选框checkbox:<Input type="checkbox" name= "ch" value="pink" checked="java" />
(多个选项可以采用相同name和type但value不同的方式)
口令框password:<input type= "password" name= "me" size= "12" maxlength="30"/>
隐藏hidden:<input type= "hidden" name="h" value= "123"/>
提交submit:<input type= "hidden" value= "123"/>
重置reset:<input type="reset"/>
< select > < option > 下拉列表
<select name="myName" size=""/>
<option value="item1"/>
<option value="item2"/>
…
</select>
<option>是子标记,size是同时可见的数目
< textArea >
<textArea name="名字" rows= "文本可见行数" cols= "文本可见列数">
</textArea>
< table >
<table>
<tr width="该行的宽度">
<th width= "单元格的宽度" >单元格中的数据</th>
<td width= "单元格的宽度" >单元格中的数据</td>
</tr>
</table>
<tr> </tr>定义表格的一个行。
<th>或<td>标记定义这一行中的表格单元。
<th>定义的单元着重显示,<td>称为普通单元,不着重显示。
< image >
<image src="图像文件的URL" >描述文字</image>
可以用width和 height属性调整宽高
< embed >(播放音频)
<embed src="音乐或视频文件的URL" >描述文字</embed>
autostart:音乐或视频文件传送完毕后是否立刻播放(默认为false)
loop:循环次数(-1则无限循环)
width、height:播放器宽和高
超链接
<a href=链接的页面地址?参数1=串值1&参数2=串值2&...&参数n=串值n >文字说明</a>
(串值中不能有汉字!)
response对象(服务器->用户,封装了对用户请求的动态响应)
动态响应contentType
利用setContentType(String s)来改变。
取值:text/html、text/plain、image/gif等。
当contentType改变时,JSP会根据新的类型将jsp页面输出结果返回
HTTP文件头(动态)
HTTP文件头可以用来禁用缓存、设置页面自动刷新和定时跳转网页等。
addHeader(String head,String value)
setHeader(String head,String value)
如果已有相关文件头则会覆盖。
response重定向(无参数跳转页面)
response.sendRedirect(URL url)
response状态行
1yy(1开头3位数):实验性质。
2yy:请求成功。
3yy:请求满足之前应采取进一步行动。
4yy:无法满足请求(404表示请求页面不存在)
5yy:服务器出现问题(500表示服务器内部发生错误)
一般不需要修改状态行,服务器会自动响应发送对应状态码。
可以用response.setStatus(int n)改变状态行。
session对象(可以再多个jsp页面反复使用)
对象id
每个session都被分配了一个String类型的id号,id会放在用户Cookie和服务器中,形成一一对应。
用户在访问web服务目录期间,服务器会给该用户分配一个session(用户会话),可以在各个页面使用它,且不同用户session不同。
URL重写(用户不支持Cookie时可以使用,保证session唯一性)
当用户从一个页面重新连接到一个页面时,通过向这个新的URL添加参数,把session对象的id传带过去
可以使用encodeURL()或者encodeRedirectURL()
String str=response.encodeRedirectURL(“second.jsp”);
存储/读取数据
存取:public void setAttribute (String key,Object obj)
(value可以是任意object)
读取:public Object getAttribute(String key)
生存期限
使用session.invalidate()使session无效
关闭服务器时session也会消失
如果用户一段时间未发送请求也会session失效
(默认30分钟,可以通过setMaxInactiveInterval(int interval)来修改)
application对象(所有用户共享,ServletContext实例)
服务器的启动与关闭决定其生命周期
常用方法
存储:public void setAttribute(String key ,Object obj)
读取:public Object Attribute(String key)
out对象(输入流,javax.servlet.jsp.JspWriter)
out.print();
out.println();
out.newLine();
out.flush();//清空缓冲区
pagecontent(获取页面out、request、reponse、session、application 等对象)
pageContext对象的创建和初始化都是由容器(Tomcat)来完成的
config(取得服务器的配置信息)
pageConext的getServletConfig() 方法可以获取一个config对象。
Servlet 初始化时,容器把某些信息通过config传递给这个 Servlet。
page(类似于this指针)
page 对象代表JSP本身,只有在JSP页面内才是合法的。
exception(显示异常信息)
只有在包含 isErrorPage=“true” 的页面中才可以被使用,
四、JavaBean
编写、使用Javabean
特点
1.可以实现代码的重复利用。
2.易编写、易维护、易使用。
3.可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。
命令规则
1.有getter和setter方法
2.boolean类型的成员变量可以用"isXXX"
3.构造方法要有public、无参数
保存javabean的字节码(.class文件)
在\WEB-INF\classes\包名\类名中(可能需要自己手动创建classes文件夹)
创建bean(JSP动作标记:useBean)
<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="application/session/page/request"/>
//scope是生命周期。
//page:当前页面
//request:request期间
//session:session期间
//application:application期间
bean加载原理
JSP引擎根据JSP动作标记给出的bean的id,以及scope,查找JSP引擎内置pageContent对象中是否含有这样的bean。
如果bean存在,就分配给用户;如果不存在,就在字节码中创建。
获取、修改beans的属性
使用getProperty、setProperty方法(前提是必须要有对应的getter和setter方法)
<jsp:getProperty name="id" property="bean属性" />
等价于对应id的javabean.getXXX().
<jsp:setProperty name=“id" property="bean的属性" value= "表达式或者字符串"/>
//property="*"时表示所有属性
//可以不写value,写param="XXX" 表示 value=<%=request.getParameter("XXX")%>
beans的辅助类(用import引入JDK提供的类或自己写的类)
五、Java Servlet(在服务器创建能响应用户请求的对象)
部署、创建与运行
javax.servlet.http包在tomcat的lib/servlet-api.jar中,使用时请导入或者放到jdkXXX/jre/lib/ext下。
servlet的类就是javax.servlet.http包中的HttpServlet类。
编写web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>myservlet.control.Example5_1_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/lookHello</url-pattern>
</servlet-mapping>
1.两个servlet-name要一样
2.servlet-class就是“包名.servlet名”
3.url-pattern就是链接,访问时的网址就是http://localhost:8080/url-pattern
运行时,servlet会被编译为字节码文件,利用web.xml,用户就可以使用servlet
传递参数
servlet名?参数1=值1&参数2=值…参数n=值
那servlet内就可以利用request.getParameter(参数名)来获取这些对应的值
eg:http://127.0.0.1:8080/ch5/lookHello?moon=loveliness
工作原理
servlet数HttpServlet类的子类的一个实例,由服务器创建并初始化。
当多个用户请求同一个servlet时服务器会为每个用户启动线程而不是进程(互不干扰,且效率更高)
生命周期
1.初始化servlet。第一次被加载时会调用init()方法,只会调用一次。
public void init(ServletConfig config) throws ServletException
2.响应请求时,调用service方法。
public void service(HttpServletRequest request HttpServletResponse response) throw ServletException,IOException
3.服务器关闭时,调用destroy()方法,关闭servlet。
public destroy()
通过JSP页面访问servlet
通过表单传递数据
1.利用<form>提交表单
2.用“computeBill?sideA=10.66&sideB=23.9&sideC=897”的多参数方法传值
通过超链接访问
<a href="servlet连接"></a>
需要注意的是href里面的不能带"/"。eg:url-pattern 是/tri 那herf=“tri”
共享变量(用户共享servlet的成员变量)
不写在doGet和doPost里的变量可以被别的servlet调用(尽量避免!)
doGet和doPost
与method的post/get对应。
如果与请求的method类型无关,那doGet的方法可以被doPost调用,反之亦然。
重定向与转发
重定向:当前页面跳转到另一个页面(无参数)
response.sendRedirect
转发:把请求转发给另一个页面(有参数)
request.getRequestDispatcher("XXX").forward(request,response)
//forward作用:使被转发的界面可以继续用request获取数据(传递参数)。
使用session
servlet不能直接用session,需要定义。
HttpSession session = request.getSession(true);
六、MVC模式
MVC模式介绍
M:模型(Model),用于存储数据的对象。
V:视图(View) ,向控制器提交所须数据、显示模型中的数据。
C:控制器(Controller),负责具体的业务逻辑操作。
在JSP中表现为:
M:javabean对象
V:JSP界面
C:servlet
模型的生命周期与视图更新
request、session、application周期的javabean
1.新建javabean对象,并放入request/session/application中。
eg: Music music=new Music();
request/session/application.setAttribute("XXX",music);
2.视图更新。让jsp页面显示javabean的数据
3.jsp页面可以通过
<jsp:useBean id="XXX" type="包名.javabean名" scope="request/session/application"/>
的方法调用。
七、JSP中使用数据库
MySQL数据库管理系统
启动mysql:打开bin/mysqld.exe
mysql有命令行模式或者图形模式。
在安装MySQL时root用户是默认的一个用户,没有密码。
JDBC(提供访问数据库的API)
连接MySQL数据库
1.加载JDBC-数据库驱动程序
需要先导入mysql-connector-java-XXX.jar到jdkxxx\jre\lib\ext下
try
{
Class.forName("com.mysql.jdbc.Driver");//8.0版本mysql为com.mysql.cj.jdbc.Driver
}
catch(Exception e)
{
System.out.println(e);
}
2.和指定的数据库建立连接
try{
String uri = "jdbc:mysql://IP地址或者localhost:端口名/数据库名";
String user ="root";
String password ="99";
Connection conn = DriverManager.getConnection(uri,user,password);
//或者直接让uri变为"jdbc:mysql://IP地址或者localhost:端口名/数据库名?user=root&password=99"
//如果端口是3306可以忽略不写
//为了防止中文乱码,有时可以再uri后添加“&characterEncoding=gb2312”
...
conn.close();
}
catch(SQLException e){
System.out.println(e);
}
mysql语句相关
建立数据库
create database 库名;
删除数据库
drop database 库名;
建表:
在命令行模式建立表时要先use 库名
CREATE TABLE bookList SET gb2312
(
ISBN varchar(100) not null ,
name varchar(100) CHARACTER SET gb2312,
price float ,
PRIMARY KEY (ISBN)
);
插入数据:
insert into bookList values('7-302-01465-5','高等数学',28.67);
查询数据
select XXX from XXX WHERE ......
删除表:
drop table 表名;
用结果集、非结果集操作数据库中的表(ResultSet)
查询数据:
try
{
Statement stmt=con.createStatement();
String sql="SELECT * FROM product"
ResultSet rs=stmt.executeQuery(sql);
While(rs.next())
{
rs.getInt("XXX");
rs.getString("XXX");
}
rs.close();
stmt.close();
//conn.close();
}
catch(SQLException e )
{
System.out.println(e);
}
数据集的字段数:
int Count_Column = rs.getMetaData().getColumnCount();
数据集第i个字段名:
String name=rs.getMetaData().getColumnName(i);
更新、删除、添加记录(无结果集)
String sql="UPDATE product SET price = 6866 WHERE name='海尔电视机'";
stmt.executeUpdate(sql);
利用结果集来更新数据库数据(改变的是数据库的数据)
rs.absolute(n);//结果集rs的游标移动到第n行
rs.update+对应类型(String columnName, 对应类型 x); //第n行的列名是columnName的值变为x
rs.updateRow();//更新结果集数据
利用结果集来插入数据库数据
rs.moveToInsertRow();//无参数,并不是最后一行而是在一个独立于之的缓冲区
rs.updateString("姓名", "赵刚");
rs.updateString("学号", "8888");
rs.updateInt(3, 66);
rs.updateInt(4, 77);
rs.updateInt(5, 88);
rs.insertRow();//更新结果集数据
预处理语句(PreparedStatement)
优点
提高了访问数据库的速度
防止sql注入
PreparedStatement pre=conn.prepareStatement(String sql);
ResultSet rs=pre.executeQuery()
pre.executeUpdate()
使用通配符(用?代替字段值)
prepareStatement pre=
con.prepareStatement("SELECT * FROM product WHERE price < ? ");
pre.setDouble(1,6565);//set+类型(索引,即第几个?,对应值);
事务(commit,一次性处理多个sql)
事务四大特性(ACID)
1、原子性(Atomicity)
事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
2、一致性(Consistency)
事务发生前和发生后,数据的完整性必须保持一致。
3、隔离性(Isolation)
当并发访问数据库时,一个正在执行的事务在执行完毕前,对应其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。备份的参数 --single-transaction
4、持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允许撤销,只能通过“补偿性事务”
conn.setAutoCommit(false);//关闭自动提交
......
conn.commit();//提交事务
在出现SQLexcption时要执行conn.rollback();进行回滚
常见数据库连接
try
{
Class.forName("com.mysql.jdbc.Driver");
String uri = "jdbc:mysql://IP地址或者localhost:端口名/数据库名";
String user ="root";
String password ="99";
Connection conn = DriverManager.getConnection(uri,user,password);
String sql="SELECT * FROM product WHERE NAME=?"
PreparedStatement pre=conn.prepareStatement(String sql);
pre.setString(1,“NO1”);
ResultSet rs=pre.executeQuery(sql);
//pre.executeUpdate();
While(rs.next())
{
rs.getInt("XXX");
rs.getString("XXX");
}
}
catch(SQLException e )
{
System.out.println(e);
conn.rollback();
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
try
{
if (pre != null)
{
pre.close();
}
if (conn !=null)
{
conn.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}