目录:
JSP原理剖析
JSP基础语法与指令
JSP内置对象及作用域
JSP,JSTL标签
Javabean
MVC三层架构
过滤器与监听器
一,JSP原理剖析
什么是JSP
Java Server Pages : Java服务 器端页面,也和Servlet- -样, 用于动态Web技术!
最大的特点:
●写JSP就像在写HTML
●区别:
。HTML只给用户提供静态的数据
。JSP页面中可以嵌入 JAVA代码,为用户提供动态数据;
jsp原理:
思路,jsp到底是如何执行的!
●代码层面没有任何问题
●服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA的tomcat中生产-个work目录
发现页面转换为java程序!
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换为一个Java类
JSP本质上就是一个Servlet
打开这个java文件,分析源码:
可以看到源代码中,所有前端代码使用
1| out. write (" <htm1>\r\n");
导入jsp的包,查看jsp的源代码
//初始化
pub1ic void . _jspInit() {
}
//销毁
public void - jspDestroy() {
}
//JSPService
pub1ic void - jspService(. HttpServletRequest request , HttpServletResponse response)
1.判断请求
2.内置一些对象
final javax. servlet. jsp. PageContext pageContext; //页面 上下文
javax. serv1et . http . HttpSession session = nu11;//sessi on
final javax. serv1et. ServletContext application; / /applicati onContext
fina1 javax. servlet. ServletConfig config;//config配置
javax. serv1et. jsp. JspWriter out = nu11;//out输出对象
fina1 java. lang. object page = this;//page:当前
Httpse rvletRequest request//请求
HttpServ1etResponse response//响应
3,输出页面前增加的代码:
response. setContentType("text/htm1"); // 设置响应的页面类型
pageContext = - jspxFactory. getPageContext(this,request,response,nu11,true, 8192, true) ;
_jspx. _page. context = pageContext;
application = pageContext. getServletcontextO;
config = pageContext. getServletConfigO;
session = pagecontext. getsession 0;
out = pageContext. getoutO ;
_jspx_ _out = out;
4.以上的这些个对象我们可以在JSP页面中直接使用!
例子:
在JSP页面中;
1只要是JAVA代码就会原封不动的输出; .
2如果是HTML代码,就会被转换为:
1| out. write (" <htm1>\r\n");
这样的格式,输出到前端! .
二,JSP基础语法与指令
新建web项目,导入依赖
<dependencies>
<!--Servlet依赖-->
<dependency>
<groupId>javax . servlet</ groupId>
<artifactId>servlet-api</ artifactId>
<vers ion>2.5</version>
</ dependency>
<!--JSP依赖-->
<dependency>
<groupId>javax. servlet . jsp</groupId>
<artifactId>javax. servlet .jsp-api</artifactId>
<version>2.3.3</version>
</ dependency>
<!-- JSTL表达式的依赖-->
<dependency>
<groupId>javax. servlet . jsp.jst1</ groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</ dependency>
<!-- standard标签库-->
<dependency>
<groupId>taglibs</ groupId>
<artifactId>standard</artifactId>
<version>1.1.2< /vers ion>
</ dependency>
</ dependencies>
任何语言都有自己的语法,JAVA中有。JSP 作为java技术的-种应用,它拥有一些自己扩充的语法(了解,知道
即可! ),Java所有语法都支持!
JSP表达式
输出结果:
JSP脚本片段:
脚本片段再实现:
打开源码:
JSP声明: 会被编译到SP生成Java的类中! 其他的,就会被生成到jspService方法中!
在JSP,嵌入ava代码即可!
1 <%%>
2 <%=%>
3| <%!%>
4
5 | <%--注释--%>
JSP的注释,不会在客户端显示,HTML就会!
JSP指令
定制错误页面
include包含声明,可单独定制网页头部和尾部,公共的部分调用,可用声明,也可用jsp标签(建议使用标签)
三,JSP内置对象及作用域
九大内置对象:
●PageContext 存东西
●Request存东西
●Response
●Session存东西
●Application [SerlvetContext] 存东西
●config [SerlvetConfig]
●out
●page
●exception
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext . setAttribute("name1", "依飞1号"); // 保存的数据只在一- 个页面中有效
request . setAttribute("name2", "依飞2号"); //保存的数据只在一次请求中有效,清求转发会携带这个数据
session. setAttribute("name3","依飞3号"); //保存的数据只在一次会话中有效,从打开浏觉器到关闭浏觉器
application. setAttribute( "name4","依飞4号"); // 保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
)<%--脚本片段中的代码,会被原封不动生成到。JSP. java
要求:这里面的代码:必领保iJava语法的正确性
)--%>
<%
//从pageContext取出。我们通过寻找的方式来
//从底层到高层(作用域) :
String name1 = (String) pageContext . findAttribute( "name1");
String name2 = (String) pageContext . findAttribute( "name2");
String name3 = (String) pageContext . findAttribute( "name3");
String name4 = (String) pageContext. findAttribute( "name4" );
String name5 = (String) pageContext . findAttribute( "name5"); // 不存在
%>
<%--使用EL表达式输出${} --%>
<h1>取出的值为: </h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3> <%=name5%> </h3>
</body>
</html>
新建一个新的jsp页面,第一个页面作为存,这个页面作为取,发现只可以取出三号和四号
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("name1", "依飞1号"); // 保存的数据只在一- 个页面中有效
request . setAttribute("name2", "依飞2号"); //保存的数据只在一次请求中有效,清求转发会携带这个数据
session. setAttribute("name3","依飞3号"); //保存的数据只在一次会话中有效,从打开浏觉器到关闭浏觉器
application. setAttribute( "name4","依飞4号"); // 保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
)<%--脚本片段中的代码,会被原封不动生成到。JSP. java
要求:这里面的代码:必领保iJava语法的正确性
)--%>
<%
//从pageContext取出。我们通过寻找的方式来
//从底层到高层(作用域) :page- >request-->session-- >application
String name1 = (String) pageContext . findAttribute( "name1");
String name2 = (String) pageContext . findAttribute( "name2");
String name3 = (String) pageContext . findAttribute( "name3");
String name4 = (String) pageContext. findAttribute( "name4" );
String name5 = (String) pageContext . findAttribute( "name5"); // 不存在
%>
<%--使用EL表达式输出${} --%>
<h1>取出的值为: </h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3> <%=name5%> </h3>
</body>
</html>
这就是不同的作用域带来的作用。
pageContext源代码
包含作用域的范围,手动设置page- >request–>session-- >application等级
●request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
●session:客户端向服务器发送请求,产生的数据,用户用完一会还有用, 比如:购物车;
●application:客户端向服务器发送请求,产生的数据,-一个用户用完了,其他用户还可能使用,比如:聊天数
据;
转发页面,地址不变
四,JSP,JSTL标签,EL表达式
依赖:
<!-- JSTL 表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式: ${}
●获取数据
●执行运算
●获取web开发的常用对象
jsp标签
<jsp:include page="jsp3.jsp"></jsp:include>包含
<<jsp:forward page="jsp2.jsp">转发
<jsp:param name="name" value="yifei"></jsp:param>携带参数,存入
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
取出值
结果:
JSP 标准标签库(JSTL)
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
核心标签(部分掌握)
添加声明:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL标签库使用步骤
●引入对应的taglib
●使用其中的方法
●在Tomcat 也需要引入jstl的包,否则会报错: JSTL解析错误;
c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="jsp1.jsp" method= "get">
<%--
EL.表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param. username }"><br>
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param. username== 'admin'}" var="isAdmin">
<c:out value="管理员欢迎您! "/>
</c:if>
<%--自闭合标签--%>
<c:out value="${isAdmin}"/>
<%--判断如果提交的用户名是管理员,则登录成功-%>
<%--if (request . getParameter(( name: "username") . equals(" admin")){
out. print("登录成功");
}
--%>
</body>
</html>
c:set
c:for
Javabean
实体类
JavaBean有特定的写法: .
●必须要有一一个无参构造
●属性必须私有化
●必须有对应的get/set方法;
一般用来和数据库的字段做映射ORM;
ORM :对象关系映射
●表–>类
●字段–>属性
●行记录—>对象
先创建一个实体类,通过jsp:useBean调用,实现java里的new
MVC三层架构
什么是MVC:
模型、Model(实体类与数据库字段)
视图、view(jsp前端显示)
控制器,Controller(控制,servlet)
早些年:
用户直接访问控制层,控制层就可以直接操作数据库;
1serv1et--CRUD-->数据库
2弊端:程序十分臃肿,不利于维护
3 servlet的代码中: 处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
4
5架构:没有什么是加一层解决不了的!
6程序猿调用
7
8JDBC
10 Mysq1 oracle sq1Server ....
现在:MVC
Model
●业务处理:业务逻辑(Service)
●数据持久层: CRUD (Dao)
View
●展示数据
●提供链接发起Servlet请求(a, form, im…).
Controller (Servlet)
●接收用户的请求: (req:请求参数、Session信…
●交给业务层处理对应的代码
●控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username, password) ---->交
给业务层处理登录业务(判断用户名密码是否正确:事务) --->Dao层查询用户名和密码是否正确-->数据库
Filter:过滤器,用来过滤网站的数据;
●处理中文乱码.
●登录验证.
Filter开发步骤:
1.导包
2.编写过滤器
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好呀,世界");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化: web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain :链
/*
1.过滤中的所有代码,在过滤特定消求的时候都会执行
2.必须要让过滤器继续同行
chain. doFilter(request, response);
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html ; charset=UTF-8");
System.out.println( "CharacterEncodingFilter执行前....");
chain. doFilter(request , response); // 让我们的请求继续走,如果不写,程序到这里就被拦截停止:!
System.out.println( "CharacterEncodingFilter执行后...");
}
//销毁: web服务器关闭的时候,过滤会销毁
public void destroy() {
System. out . println("CharacterEncodingF ilter销毁" );
}
}
<servlet>
<servlet-name>ShowServlet</servlet-name
<servlet-class>com.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是/servlet的任何请求,会经过这个过滤器-->
<url-pattern>/serv1et/* </url-pattern>
<!--<ur1-pattern>/* </ur1 -pattern>-->
</filter-mapping>
监听器
实现-一个监听器的接口; (有N种)
1.编写一个监听器
2.实现监听器的接口
package com;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数:统i计session .
public class OnlineCountListener implements HttpSessionListener {
//创建session监听:看你的一举一动
// 一旦创述Session就会触发一次这个事件!
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = new Integer(1);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count + 1);
ctx.setAttribute("OnlineCount", onlineCount);
}
}
//销毁session监听
//一旦销毁Session就会触发一次这个事件!
@Override
public void sessionDestroyed( HttpSessionEvent se) {
ServletContext ctx = se. getSession(). getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = ( Integer) ctx . getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer( 1);
}else {
int count = onlineCount . intValue();
onlineCount = new Integer(count+1);
ctx . setAttribute( "OnlineCount" , onlineCount);
}
}
}
/*
Session銷毁:
1.手动销毁getSession(). invalidate();
2.自动销毁
*/