今日拓展
-
TCP是底层通讯协议,定义的是数据传输和连接方式的规范
-
HTTP是应用层协议,定义的是传输数据的内容的规范
-
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
-
HTTP支持的是www服务
而TCP/IP是协议
它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。 -
WWW(World Wide Web)服务是一种建立在超文本基础上的浏览、查询因特网信息的方式,它以交互方式查询并且访问存放于远程计算机的信息,为多种因特网浏览与检索访问提供一个单独一致的访问机制。Web 页将文本、超媒体、图形和声音结合在一起。因特网给企业带来通信与获取信息资源的便利条件.
-
WWW服务是目前应用最广的一种基本互联网应用,我们每天上网都要用到这种服务。通过WWW服务,只要用鼠标进行本地操作,就可以到达世界上的任何地方。由于WWW服务使用的是超文本链接(HTML),所以可以很方便的从一个信息页转换到另一个信息页。它不仅能查看文字,还可以欣赏图片、音乐、动画。最流行的WWW服务的程序就是微软的IE浏览器
-
核心技术包括:超文本传输协议(Hypertext Transfer Protocol,HTTP)与超文本标记语言(Hypertext Markup language,HTML)。其中,HTTP是WWW服务使用的应用层协议,用于实现WWW客户机与WWW服务器之间的通信;HTML语言是WWW服务的信息组织形式,用于定义在WWW服务器中存储的信息格式
JavaWeb
JSP
9大内置对象
- PageContext 存
- Requst 存
- Response
- Session 存
- Application 【ServletContext】 存东西的
- config
- out
- page
- exception
主要了解这四个作用域!!!
- page(1)->request(2)->session(3)->application(4)
pageContext.setAttribute("name1","小明1号");//保存的数据只在一个页面中有效
request.setAttribute("name2","小明2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据(如果这个请求没有在被继续转发,或者这个请求崩了,那么这个数据也就没了)
session.setAttribute("name3","小明3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","小明4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
/*源码
* public void setAttribute(String name, Object attribute, int scope) {
switch(scope) {
case 1: 再第一层page作用域
this.mPage.put(name, attribute);
break;
case 2: 在第二层request作用域
this.mRequest.put(name, attribute);
break;
case 3: 再第三层session作用域
this.mSession.put(name, attribute);
break;
case 4: 再第四层application作用域
this.mApp.put(name, attribute);
break;
default:
throw new IllegalArgumentException("Bad scope " + scope);
}
* */
//跨页面取数据
//从pageContext中取出,我们通过寻找的方式来
//从底层到高层(作用域)page(1)->request(2)->session(3)->application(4)
//跨页面取数据,前两个都取不出来
String name1 = (String) pageContext.getAttribute("name1");//取不出来
String name2 = (String) pageContext.getAttribute("name2");//取不出来
String name3 = (String) pageContext.getAttribute("name3");//取得出
String name4 = (String) pageContext.getAttribute("name4");//取得出
String name5 = (String) pageContext.getAttribute("name5");//不存在
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--%>
<%--转发到哪个页面--%>
<%--从forward转发的时候可以用标签的形式携带参数--%>
<%--http://localhost:8080/jsptag.jsp?name=小明&age=18--%>
<%--jsp:forward标签里面不能写注释,写了页面中就会报500--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="sdf"></jsp:param>
<jsp:param name="age" value="18"></jsp:param>
</jsp:forward>
JSTL表达式:
- **JSP 标准标签库(JSTL)**是一个JSP标签集合,它封装了JSP应用的通用核心功能。
- JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签
JSTL标签的使用就是为了弥补HTML标签的不足;他自定义了许多标签,可以供我们使用,标签的功能和Java代码一样!
核心标签(掌握部分)
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用其中的方法:
- 再Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库,我们才能使用JSTL 核心:core--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<%--提交到当页面--%>
<form action="jstl.jsp" method="get">
<%--
EL表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎你!"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
c:when
<body>
<%--定义一个var类型的变量score,它的值为80--%>
<c:set var="score" value="80"/>
<c:choose>
<%--它的判断顺序是按照语句从上到下的
假如成绩为100;
那么如果大于90的这条语句在前就会输出成绩优秀
如果大于80 的这条语句在前就会输出成绩良好
它是按照语句的顺序,只要语句在上面,且满足条件,就会输出
--%>
<c:when test="${score>=90}">
你的成绩为优秀
</c:when>
<c:when test="${score>=80}">
你的成绩为良好
</c:when>
<c:when test="${score>=70}">
你的成绩为一般
</c:when>
</c:choose>
</body>
c:forEach
<%
ArrayList<String> people = new ArrayList<>();
people.add("张三");
people.add("李四");
people.add("王五");
people.add("赵六");
people.add("田七");
//存入值
session.setAttribute("peopl",people);
%>
<%--用c:foreach取--%>
<%--
var :每次遍历出来的变量
items:要遍历的对象
begin:从哪开始
end: 到哪里
step:步长
--%>
<c:forEach var="people" items="${peopl}">
<c:out value="${people}" /><br>
</c:forEach>
<hr>
<c:forEach var="people" items="${peopl}" begin="1" end="3" step="2">
<c:out value="${people}"/> <br>
</c:forEach>
JavaBean
bean:是豆子的意思
通常叫它实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表—>类
- 字段–>属性
- 行记录—>对象
<%
// People people = new People();
// people.setAddress();
// people.setAge();
// people.setName();
// people.setId();
%>
<jsp:useBean id="people" class="com.feng.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="长沙"/>
<jsp:setProperty name="people" property="age" value="18"/>
<jsp:setProperty name="people" property="name" value="小明"/>
<jsp:setProperty name="people" property="id" value="1"/>
<%--jsp:getProperty --%>
<jsp:getProperty name="people" property="id"/>
<jsp:getProperty name="people" property="name"/>
<jsp:getProperty name="people" property="age"/>
<jsp:getProperty name="people" property="address"/>
MVC三成架构
- 什么是MVC :Model view Controller 模型、视图、控制器
早些年
用户直接访问控制层,控制层就可以直接操作数据库:
- 直接再Servlet中写增删改查去操作数据中的对象
- 弊端:会把JDBC的代码也写到处理请求中去,程序异常臃肿,不利于维护。
- 因为:Servlet的代码中本来就要写:处理请求,响应,视图跳转(重定向,转发)、初次之外还要:处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的!如果有就 再加一层。
例如:
程序员调用
|
JDBC //加的一层
|
Mysql、Oracle、SqlServer
MVC三层架构
View
- 展示数据
- 提供连接发起Servlet请求(可以通过:a、form、img…)
Controller (Servlet)
- 接受用户的请求:(req:请求的参数、Session信息…)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,如:username,password)--->交给业务层处理登录业务(判断密码是否正确:事务)--->Dao层查询用户名和密码是否正确。=--->数据库
Model
- 业务处理:业务逻辑(Servlet)
- 数据持久层:CRUD (Dao)
Filter(过滤器)(重点)
- 用来过滤网站的数据;
- 处理中文乱码
- 登录验证…
Filter开发步骤:
-
导包
-
编写过滤器
-
导包不要错了:javax.servlet.Filter包
-
实现Filter接口,重写方法
-
//web服务器启动的时候 这个类就初始化了,因为他要随时等待监听
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
/*
* filterChain:链
1.过滤器中的所有代码,再过滤特定请求的时候都会执行
2.必须要让过滤器继续通行:filterChain.doFilter(servletRequest,servletResponse);
*
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("执行前!!");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走转发下去,如果不写,程序到这里就被拦截停了
System.out.println("执行后!!");
}
//销毁:web服务器关闭的时候,过滤器会销毁
@Override
public void destroy() {
System.out.println("销毁");
}
}
- 再web.xml中配置Filter
<filter>
<filter-name>characterencodingfilter</filter-name>
<filter-class>com.feng.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterencodingfilter</filter-name>
<!--只要是/servlet下的然和请求,都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
监听器
实现一个监听器的接口:(有N种)
-
编写一个监听器
实现监听器的接口
package com.feng.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; //统计网站在线人数:统计session个数 public class OnlineContListtener implements HttpSessionListener { //创建session监听 //一旦创建一个Session就会触发一次这个事件! @Override public void sessionCreated(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer onlineCont = (Integer) servletContext.getAttribute("onlineCont"); if (servletContext==null){ onlineCont=new Integer(1); }else { int count = onlineCont.intValue(); onlineCont=new Integer(count++); } servletContext.setAttribute("onlineCont",onlineCont); } //销毁session监听 @Override public void sessionDestroyed(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer onlineCont = (Integer) servletContext.getAttribute("onlineCont"); if (servletContext==null){ onlineCont=new Integer(0); }else { int count = onlineCont.intValue(); onlineCont=new Integer(count--); } servletContext.setAttribute("onlineCont",onlineCont); } }
- web.xml中注册监听器
<!--注册一个监听器--> <listener> <listener-class>com.feng.listener.OnlineContListtener</listener-class> </listener>
3.几乎不用