Web开发的标准目录结构
JSP
- 名称:Java Server Pages
JSP和Servlet的比较
- JSP和Servlet都是Java的Web解决方案
类型 | 实现html的方式 | 优缺点 |
---|---|---|
JSP | 可以嵌入到HTML语句中,大大简化了网页的设计修改 | 自动并入任何文件的变动,加载运行很快 |
Servlet | 一句一句输出,改代码不是很方便 | 任何文件的变动都需要对此Servlet重编译 |
1、JSP的开发就是在html语言中嵌入Java代码
通过<%%>嵌入Java代码(Scriptlet)
2、第一次请求JSP文件,会生成对应的Servlet文件,并把Servlet文件(Java文件)编译成class文件,最后响应给客户端。(之后不需要,速度加快)
语法:
1、注释:/**/、//、<%-- --%>(客户端无法看见(隐式注释))、<!-- -->
2、Scriptlet(脚本小程序)
<%%>、<%!%>、<%=%>(编写Java代码)
三种指令:
- page指令: 用于传递与页面相关的信息,如缓冲区信息、内容类型
和出错处理信息等。 - include指令:用于在页面中包含一个外部的文档。如著作权文档或
者公司信息文档——把通用内容写在一个文档中,然后包含在各个
页面中,比直接写在各个JSP页面中更容易维护。当然,被包含的文
件也可能是另一个JSP文件。 - taglib指令:用于指出页面可以调用的一个客户标签库,常用于自
定义标签。
page指令:
1、contentType:定 义 JSP 字 符 的 编 码 和 页 面 响 应 的 MIME 类 型 , 如 果 是 中 文 的 话 则 使 用 如 下 形 式 :contentType="text/html;charset=GBK"
2、import: 此jsp页面要导入那几个操作包,例:import="java.util.*"。
3、isErrorPage:可以设置true或false,正确页面跳转到什么,错误页面跳转到什么(errorPage="error.jsp", 内容显示的是error.jsp, 但是地址栏不变)
<%@ page erroePage="error.jsp"%>
<%@ page isErrorPage="true"%> // 表示此页面可以处理错误
4、pageEncoding:JSP页面的字符编码,默认值为pageEncoding="iso-8859-1",如果是中文则可以设置为:pageEncoding="GBK"。
include指令(动态和静态):
- 静态包含语法:
通过执行JSP,生成的Java文件,可知JSP文件是先生成Java文件,后执行
<%@ include file="要包含的文件路径"%>
例子:<%@ include file="info.htm"%>
- 动态包含语法:
动态包含:会把包含文件和被包含文件都编译为Java文件,然后一起执行
1、不传递参数:
<jsp:include page="{要包含的文件路径 | <%=表达式%>}" flush="true|false"/(默认true)>
2、传递参数:
<jsp:include page="{要包含的文件路径 | <%=表达式%>}"flush="true | false">
<jsp:param name="参数名称" value="参数内容"/>
... 可以向被包含页面中传递多个参数
</jsp:include>
内置对象:
- 为了简化用户开发,系统定义好的的,直接使用
1 pageContext javax.servlet.jsp.PageContext JSP的页面容器
2 request javax.servlet.http.HttpServletRequest 得到用户的请求信息
3 response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4 session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5 application javax.servlet.ServletContext 表示所有用户的共享信息
6 config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
7 out javax.servlet.jsp.JspWriter 页面输出
8 page java.lang.Object 表示从该页面中表示出来的一个Servlet实例
9 exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用
四种属性(常见)范围(可共享的范围)
• pageContext:只在一个页面中保存属性,跳转之后无效。
• request:只在一次请求中保存,服务器跳转后依然有效。
• session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
• application:在整个服务器上保存,所有用户都可以使用
属性操作方法:
1、Page属性范围:只在当前JSP页面有效(每个JSP都会创建新的实例对象)
2、要想有效,可通过request请求访问,可在跳转页面后继续保存信息(超链接不可获取请求)(需要Get或Post)(只创建一次实例对象)
3、Session可以获取前两个请求,但浏览器关闭后,将不在保存他(和它本身会话性质相同)(刷新页面也会共享JavaBean实力,会叠加)
4、application只要服务器不关闭,都可以获取它的属性(最大范围)
(不要设置太多的application太多属性,会影响服务器性能)
1 public void setAttribute(String name,Object o) 设置属性的名称及内容
2 public Object getAttribute(String name) 根据属性名称取得属性
3 public void removeAttribute(String name) 删除指定的属性
JDBC(Java数据库连接)
- API(类和接口)
连接过程:
- 加载数据库驱动—发送查询语句—建立与数据库连接—获取查询结果
操作的基本流程
DBUtils(数据库连接池)代码:
package com.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtils
{
// 加载驱动,并建立数据库连接
public static Connection getConnection() throws SQLException, ClassNotFoundException
{
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/demo?serverTimezone=GMT&useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
//释放数据库连接
public static void release(ResultSet rs, Statement stmt, Connection conn) throws SQLException
{
if (rs != null)
{
rs.close();
}
rs = null;
release(stmt, conn);
}
public static void release(Statement stmt, Connection conn) throws SQLException
{
if (stmt != null)
{
stmt.close();
}
stmt = null;
if (conn != null)
{
conn.close();
}
conn = null;
}
}
JavaBean
优点
- 在JSP开发中可以使用JavaBean减少重复代码
- JSP中提倡少些java代码,所以我们可以通过写JavaBean代码,然后导入JSP文件中,进行操作
- 最大的特点:表单的交互
文件配置及导包问题
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="com.org.SimpleBean"%>
属性:
1.所有的类必须放在一个包中,在WEB中没有包的类是不存在的;
2.所有的类必须声明为public class,这样才能够被外部所访问;
3.类中所有的属性都必须封装,即:使用private声明;
4.封装的属性如果需要被外部所操作,则必须编写对应的setter、getter方法;
5.一个JavaBean中至少存在一个无参构造方法,此为JSP中的标签所使用。
指令:
1、<jsp:useBean id="实例化对象名称" scope="保存范围" class="包.类名称"/>(导包)
主要属性:
• id:表示实例化对象的名称
• scope:表示此对象保存的范围,一共有四种属性范围:page、request、session、application
• class:对象所对应的包.类名称
2、<jsp:setProperty>(给指定属性设值)
自动匹配:<jsp:setProperty name="实例化对象的名称(id)" property="*"/>(最实用,保证名称和属性名同名才可使用)
指定属性:<jsp:setProperty name="实例化对象的名称(id)" property="属性名称"/>
指定参数:<jsp:setProperty name="实例化对象的名称(id)" property="属性名称"param="参数名称"/>
指定内容:<jsp:setProperty name="实例化对象的名称(id)" property="属性名称"value="内容"/>
<jsp:setProperty name="simple" property="name"/>
<==> String username=request.getParameter("name"); simple.setName(username);
DAO(数据访问对象)
- 主要的功能就是用于进行数据操作的
- 企业分层架构:客户曾(浏览器访问)、显示层(JSP/Servlet)、业务层(DAO操作进行组合,组合成完整的业务逻辑)、数据层(DAO,增删改查等原子性操作)
组成部分:
1.DatabaseConnection:专门负责数据库的打开与关闭操作的类;
2.VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;
3.DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等;
4.Impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭;
5.Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作;
6.Factory:工厂类,通过工厂类取得一个DAO的实例化对象。
实战:
MVC分层Web开发
Mode Ⅰ
处理情况分为两种:
1、完全使用JSP进行开发
2、使用JSP + JavaBean的模式进行开发
Mode Ⅱ
MVC设计模式(Model-View-Controller):
以Servlet为主体, 由Servlet接收所有的客户端请求,之后根据请求调用相应的JavaBean,并将所有的显示结果交给JSP完成,也就是俗称的MVC设计模式。
• 模型层(Model)
模型所表示的是具体做工作的部分,并对应用所要解决的实际问题进行建模。
• 视图(显示层)(View)
视图是模型的表示,用户可以看到视图并与之交互。
• 控制器(控制层)(Controller)
控制器是应用中对用户命令做出响应的部分,它要决定如何修改或获取模型,还要决定如何显示视图
EL/JSTL(JSP)
- EL(表达式语言Expression Language)(JSP2.0新增)
${属性名称.属性范围.名称} <==> <%= 表达式%>
${pagecontext.request.remoteAddr}
${pageContext.session.id}
1 pageScope 表示 从page属性范围查找输出属性(用的较多)
2 requestScope 表示 从request属性范围查找输出属性(用的较多)
3 sessionScope 表示 从session属性范围查找输出属性(用的较多)
4 applicationScope 表示 从application属性范围查找输出属性(用的较多)
5 pageContext 表示 javax.scrvlet.jsp.PageContext对象
6 param 接收传递到本页面的参数
7 paramValues 接收传递到本页面的一组参数
8 header 取得一个头信息数据
9 headerValues 取出一组头信息数据
10 cookie 取出cookie中的数据
11 initParam 取得配置的初始化参数
{}中的运算符:+-*/% == != < > <= >= && || !
JSP客户标签
- TagSupport
要想实现一个标签,直接继承javax.servlet.jsp.tagext.TagSupport类
如果要定义的标签内没有标签体,则直接覆写TagSupport类中的doStartTag()方法即可。
在.tld文件中进行配置,然后进行<mytag:hello/>定义,就会执TagSupport类中的doStartTag()方法
<taglib-uri>映射名称<taglib-uri>