赞
踩
JavaWeb开发它是一个结合,将前期学的所有内容结合到一起,JavaWeb新内容不是特别多
但JavaWeb开发的思想咱们要在这个阶段形成,在现在开发中JavaWeb的相关技术不在直接使用,甚至有些技术不在使用,但是Web开发的模式及思想需要咱们形成
前期的所有内容不能称为软件,视图和底层处理并没有真正的结合,JavaWeb开始,我们可以看到视图(界面)+服务端处理+数据库交互,来形成一个完整项目。
(1)C/S:Client/Server(客户端/服务器)
指要在自己电脑上安装专属客户端,使用该客户端与服务端进行交互
类似于:QQ/微信/大型网游/多媒体教学软件
优点:
1. 便于留存( 可以有效的利用带宽,在网络传输中只需传输变动数据,提高软件的留存率)
2. 易于大型软件使用
缺点:
1. 开发成本高
2. 维护成本高
(2)B/S:Blag/Server(浏览器/服务器)
B/S结构指用户通过浏览器可以直接访问,这种方式是目前使用比较广的方式
优点:
(1)服务端:JavaSE\数据库\Setvlet/JavaEE框架技术
(2)客户端:HTML\avaScript\JQuery\Ajax\其他前端框架
在web应用都是使用请求——响应这种模式进行的;
在B/S结构是不存在没有请求直接由服务端主动向客户端推送数据的;
(1)硬件服务器:一台电脑、云服务器
(2)软件服务器:软件服务器又叫应用服务器,它是运行在电脑上的一个软件
在该软件上可以部署运行其他应用,此时这个软件我们就叫服务器。
Tomcat是一个 JavaEE的应用服务器,我们编写的 Web应用发布到tomcat服务器后,启动服务器就可以被用户访问(通过浏览器及网址直接访问)
应用服务器用于编译、解析、发布我们的程序
- Tomcat目录结构
- 配置环境变量
CATALINA_HOME
%CATALINA_HOME%in
和 %CATALINA_HOME%lib
以管理员身份打开cmd,然后进入 tomcat 的 bin 目录,输入 service.bat install
打开bin目录双击startup.bat文件。
浏览器里输入:http://localhost:8080/
成功打开则说明下载及配置成功
参考这篇文章:https://zhuanlan.zhihu.com/p/100092323
JSP全称:Java Server Page(Java服务器页面)
JSP是在HTML文件中嵌入Java代码,在页面中可以使用Java代码执行动态内容,使用 HTML代码执行静态内容
Java代码负责功能处理并动态生成结果,HTML对页面及Java生成的结果进行美化及展示
常用编码:
ISO-8859-1:西方编码不支持中文
GB 2312:支持中文,只支持简体中文
GBK:支持中文,支持简体中文和繁体中文
UTF-8:支持全球所有国家的语言
1. 静态内容:HTML/CSS/JavaScript
2. 指令<%@ 指令名%>: 指令名一般用于设置页面
3.小脚本<%java代码%>:用于编写java代码,除了不能定义方法和属性可以写任意java代码
4.表达式<%=表达式%>:用于向页面输出java内容
5.声明<%!声明内容%>:用于在页面中声明方法
6.注释<%–JSP–%>:JSP注释
7.标准动作< jsp:动作名/>:用于在JSP页面中执行一个功能
.isp转义>.java编译>.class执行>JVM
JSP页面在第一次执行时,效率低;因为第一次执行需要先转义在编译在执行
而从第二次开始则不再进行转义和编译直接执行class文件
JSP页面的执行分两部分:
1.首先由服务端执行Java代码,执行后将执行的结果以 html的形式响应到客户端
2.由客户端对响应来的HTML代码进行解释执行
request对象
请求对象,客户端向服务端发送称为请求对象
request. getParameter( “paramName”):根据客户端提交参数的参数名获得对应的参数值(表单)
request.setCharacterEncoding(“UTF-8”):设置请求对象的编码集
request.setAttribute( “key” , “value”):向request对象的作用域中存储了一个属性(可以存储多个属性)
request.getAttribute(“key”):根据属性名获得request对象中存储的属性值
request.getRequestDispatcher(url).forward(request, response):请求转发
response对象
响应对象,服务端向客户端发送的称为响应对象
response.sendRedirect(“ur1”):重定向,用于实现页面跳转(类似于超链接,但重定向不需要点击自动跳转)
使用重定向可以实现页面跳转,但不能向目标页面传递"请求对象"
请求转发和重定向的区别?(面试必问题)
共同点:都可以实现页面跳转
不同点:
(1)浏览器显示地址栏显示地址不同
重定向在实现跳转时浏览器地址栏显示的地址为目标地址
请求转发在实现跳转时浏览器地址栏显示的地址是源地址(转发源)
(2)传递数据不同
(3)处理机机制不同
请求转发和重定向的选择问题?
一般情况下,如果要跳转到页面而且不需要传递请求数据,此时我们使用重定向跳转
如果是服务器内部的处理程序之间进行跳转或向要将请求对象传递给页面,则此时建议使用请求转发
内置对象不是由开发者创建的,而是由"应用服务器创建的(tomcat)",在JSP页面里可以直接使用这些对象
request:(请求对象)
他是一个作用域对象,表示客户端向服务端发送的一次请求
当发送请求时,客户端会将客户端的相关数据"以字节码的形式""发送到服务端,服务端会将这些请求的字节码进行解码,封装到request对象中
客户端发送的数据:
请求对象还可以存放属性,这些属性不是客户端传入的,而是服务端为了"传递数据"主动向request存放的数据
常用方法:
(1) request.setCharacterEncoding("utf-8"):设置request对象的编码集
(2) request.getParameter("paramName"):根据参数名获得对应的参数值
(3) request.getParameterValues("paramName"):根据参数名获得一组同名的参数值,返回字符串数组
(4) request.setAttribute(attrName,attrValue):向request作用域中设置一个属性
(5) request.getAttribute(attrName);从request作用域中获取一个属性的值,默认为Object类型
(6) request.getRequestDispatch(url).forward(request,response);请求转发
response:响应对象,服务端对客户端的回应
服务端向客户端响应也可以传递数据,传递的是字符串
响应对象向客户端传递数据的方式有以下三种:
通过url传参传递
通过Cookie传递
//创建Cookie对象
Cookie cookie = new Cookie("phone","110");
//将cookie对象添加到response对象中
response.addCookie(cookie);
response.sendRedirect("demo2.jsp");
PrintWriter writer = response.getWrite();
out.println("hello");
响应对象的常用方法:
response.sendRedirect(url) //重定向,用于实现页面跳转
response.setContentType("text/html;charset=utf-8") //设置响应的内容类型及编码集
response.addCookie(cookie) //向请求对象中添加Cookie对象,此时response对象就会将cookie发送到客户端由浏览器保存cookie
response.getWrite();获得一个输出流,通过该输出流可以向客户端直接输出内容,如果需要输出中文则需要设置"内容类型"
session:会话对象
表示一个会话,什么是会话?
JavaWeb为什么会存在session的概念?
web应用中如何利用session来维持客户端和服务端的关系?
通过sessionId维持
当客户端第一次访问服务端,服务端是否存在对应sessionId,若不存在则是第一次访问
服务端创建一个session对象生成一个唯一的sessionId,将该sessionId保存到服务端并响应到客户端
客户端浏览器接受到该sessionId,会自动将该sessionId保存下来(临时存储)
客户端每次向服务端发送请求时都会将sessionId自动发送到服务端
服务端接收到sessionId检测该sessionId是否有效,同时可以从session对象中获取数据
session依赖于浏览器,不同的浏览器产生不同的sessionId
session开始和销毁条件
销毁有以下几种方式:
关闭浏览器
服务端手动销毁,使用session.invalidate();销毁
超时,当客户端在一定时间内未向服务端发送任何请求,服务端会认为该session失效自动销毁(tomcat的默认超时时间为30分钟)
服务器关闭或重启
session常用方法
session.getId():获得sessionId
session.invalidate():销毁session
session.setAttribute(attrName,attrValue):向session作用域中存放一个属性
session.getAttribute(attrName):从session中获取一个属性值
application:应用服务器对象
该对象表示当前应用服务器
该对象也属于作用域对象,其中可以存放数据,但该对象作用域于整个服务器,该对象在任何位置任何人都可以获取
因此在因此在application对象存放的数据为整个服务器的共享数据,关于用户的数据不允许在该对象存放
out:输出对象(向页面输出内容对象,该对象不在使用)
page:表示当前对象(当前页面对象,等同于this关键字)
pageContext:页面上下文对象(当前页面上下文对象,该对象不使用)
config:配置对象(配置对象,在页面中可以获取配置信息,不使用)
exception:异常对象(处理JSP页面异常,不再使用)
答:servelt类是运行在服务端的一个Java类,该类有respect(请求对象),response(访问对象),和访问地址
用于获取客户端请求并向客户端响应
(1)创建一个类继承HttpServlet类,当一个类继承了HttpServlet类这个类就是Servlet类.
(2)重写HttpServlet类的doGet和doPost方法(重写其中一个或者其中两个)
doGet方法:用于处理客户端提交的get请求
doPost方法:用于处理客户端提交的Post请求
Get和Post请求区别(面试重点)
get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
post请求一般是去提交数据。
get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,
不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
post请求是没有的长度限制,请求数据是放在body中;
get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
get请求可以被缓存,post请求不会被缓存。
get请求会被保存在浏览器历史记录当中,post不会。
get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
get请求只能进行url编码(appliacation-x-www-form-urlencoded),
post请求支持多种(multipart/form-data)等。
(3)对Servlet进行配置,对Servlet进行配置方式有两种:
Servlet类的实例不是由开发者自己创建的,而是由应用服务器自己创建的,
Servlet类一旦创建成功就保存在了服务端内存中Servlet一旦创建就保存在服务端内存中,可以通过该Servlet对象的“映射地址”来访问Servlet对象
Servlet访问流:
(1)客户端直接访问url-pattern,服务器会根据url-pattern查找当前映射路径所对应的servlet对象
(2)根据servlet对象名来查找当前对象所对应的对象名
(3)根据请求类型执行对象中对应的方法
<!-- servlet配置
servlet-name:指定对象的对象名
servlet-class:
-->
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>com.jiazhong.registeAndLogin.servlet.ServletDemo</servlet-class>
</servlet>
<!--servlet映射配置
servlet-name:Servlet对象名,与servlet配置的对象名一致
url-pattern:配置当前Servlet映射地址,地址名可以任意
-->
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demo.do</url-pattern>
</servlet-mapping>
(2)用注解进行配置
在Servlet类上面使用@WebServlet(当前Servlet访问路径)注解进行配置即可
Servelt的生命周期
Servelt从创建到消亡的过程
第一次请求与Servlet:先执行无参数的构造方法创建Servlet对象,然后执行init方法,执行doGet方法
从第二次请求开始,不在创建Servlet对象,而是直接访问doGet方法(服务方法)
(1)Servlet的生命周期包含以下几个阶段:
Servlet的创建时机:
1. 默认情况下,用户第一次访问Servlet时,服务器会创建Servlet对象(懒加载机制)
2. 我们可以在注解
中加入"loadOnStartup=0"
或者在web.xml
中<servlet>
加入标签<lodad-on-startup>
来修改Servlet创建的创建优先级,当值为0时表示服务器启动时会自动创建Servlet对象
JSP页面中会存在大量JAVA代码
什么是JSTL页面
JSTL全称JSP标准标签库,使用JSTL可以在JSP页面上通过一些标签实现逻辑处理能力
虽然JSTL是页面标签,但是每个标签后面都有一个Java类继承
JSTL包含一下标签
JSTL的使用
①在Maven中引入JSTL依赖包
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-compat</artifactId>
<version>1.2.5</version>
</dependency>
②JSP页面引入JSTL核心标签库
<%--
taglib:引入JSTL标签库
prefix:设置标签的前缀,核心标签一般为c
url:指定标签库位置
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
③在页面中使用
JSTL核心标签的常用标签
①out标签:<c:out>
,out标签主要用于向页面输出内容
<c:out value="${name}" default="自定义内容" escapeXml="false"/>
<!--
value:表示输出的值,如果输出的值为EL表达式,则表示为某个作用域的值
default:默认值,若value没有值则输出 dafault的值
escapexml:是否对xml/html解释执行
--!>
②set标签:<c:set>
,用与向某个作用域设置属性,用来替换setAttribute();
<c:set value="20" var="age" scope="request"></c:set>
<!--
向requst作用域设置一个age=20的属性
-->
③remove标签:<c:remove>
,主要用于从某个作用域中移除某个属性
<c:remove var="age" scope="request"></c:remove>
<!--
删除request中属性名为age的属性
-->
④if标签:<c:if>
单分支语句标签
<c:if test="${判断语句}">
输出内容
</c:if>
<!--
判断test属性的值,如果为true则执行标签体内容,如果为false则不执行
*JSTL中只有if标签没有else标签,JSTL没有if-else标签,JSTL可以使用choose标签来替代
-->
⑤choose标签:<c:choose>
等同于java中的Switch语句,该标签不能单独使用,必须搭配when标签 已经otherwise标签 搭配使用
<c:choose>
<c:when test="判断语句">输出内容</c:when>
<c:when test="判断语句">输出内容</c:when>
<c:otherwise>其他内容</c:otherwise>
</c:choose>
<!--
判断 第一个when标签的test属性,若true则执行,反正向后继续执行,
若when标签test属性都为false
则返回 otherwise标签
-->
⑥forEach标签:<c:forEach>
等同于java中的for循环
<%
List<String> strList =new ArrayList<>();
strList.add("1");
strList.add("2");
strList.add("3");
request.setAttribute("strList",strList);
%>
<c:set var="str" value="${strList}" scope="request"></c:set>
<c:forEach var="str1" items="${str}" varStatus="status">
${str1}--->${status.index}---->${status.count}<br>
</c:forEach>
<!--
items:用于执行遍历的集合
str:每次遍历的值会赋给该遍历
varStatus:循环的状态
循环下标:status.index 循环次数:status.count
-->
<c:forEach begin="1" end="9" step="1" varStatus="status">
${status.index}-------->你好《=<br>
</c:forEach>
<!--
begin:从某值开始循环,起始大小
end:表示结束大小
step:表示步长,相当于 i++,i+2....
--!>
格式化标签的使用
引入格式化标签
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
格式化时间:
<fmt:formatDate value="${nowTime}" pattern="yyyy年MM月dd日 HH:mm:ss"/>
格式化数字
<fmt:formatNumber value="1234567895.646" pattern="###,###,###.##"></fmt:formatNumber>
用于替换JSP中<%=Java代码%>
EL表达式语法简介,功能强大,在JSP页面会大量的使用EL表达式而不再使用传统的脚本
EL表达式的主要用于向从作用域中获得属性的值并向页面输出的
EL表达式基本功能
计算机向页面输出内容
--------------------------分隔符---------------------------------------
EL表达式目前默认是被禁用的,使用的话需要配置,在JSP页面里设置isELIgnored="false"
表示关闭忽略EL表达式,或者在Web.xml文件里配置,创建项目生成的web.xml文件不是标准的配置文件,可删掉
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
计算并输出内容
${"hello,word"}
${2+2}
从作用域中获取对象
JSP作用域对象包括,request,session,application,这三个对象都可以存储属性,通过EL表达式可以很便捷的从这三个作用域中获取属性的值
<c:set value="1" var="sex" scope="request"/>${sex==1?"男":"女"}
<!--传统方式-->
<br><hr>
<%
Integer i=Integer.valueOf((String) request.getAttribute("sex"));
%>
<%=i+10%>
<!--使用EL表达式-->
${sex+11}
EL表达式从作用域中获取的值默认是有顺序的:按作用域范围从小到大取值
由于EL表达式默认从作用域最小的作用域对象中查找数据,除非属性在page作用域否则会查找其他作用域,效率不高
一般我们会避免EL表达式从作用域中自动搜索,我们从指定作用域搜索
<c:set var="name" value="sessionName" scope="session"/>
<c:set var="name" value="application" scope="application"/>
<c:set var="name" value="requestName" scope="request"/>
${sessionScope.name}------->session作用域取值<br>
${requestScope.name}-------->request作用域取值<br/>
${applicationScope.name}------->application取值<br/>
获取对象中的属性值
EL表达式从实体对象获取属性的值时使用的名字与属性名无关${requestScope.student.stuName}
EL表达式内部将字符串"stuName"的首字母转换为大写并在前面拼接上"get"字符串,形成get方法的方法名字符串
然后使用反射技术根据get方法的方法名获得get方法的方法对象并调用该方法
简单理解EL根据获取实体对象属性值是根据get方法获取
创建一个类实现package javax.servlet.Filter
接口
实现接口的doFilter方法(该方法用于实现过滤逻辑)
doFilter中要有结果处理(将请求放行或转到其他地方),否则请求会停留在过滤器中
filterChain.doFilter(servletRequest,servletResponse);
//放行继续访问该位置
配置过滤器
<!--
配置过滤器对象,配置后tomcat会自动创建过滤器对象
<filter-name>:指定过滤器对象名
<filter-class>:指定要配置过滤器的类
-->
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>com.jiazhong.filters.demoFilter</filter-class>
</filter>
<!--
配置过滤器映射,配置后当浏览器访问该映射路径时对应过滤器会自动执行
<filter-name>:要执行的过滤器对象
<url-pattern>: 过滤器映射路经,配置后,只要访问该路径下资源过滤器自动执行
-->
<filter-mapping>
<filter-name>demoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@WebFilter()
注解配置① 当服务器启动时 Filter 对象被创建并自动执行 init 方法
② 当每次访问被过滤器拦截的 web 资源时执行 Filter 中的 doFilter 方法实现过 滤功能
③ 当服务器关闭时执行 Filter 的 destroy 方法销毁相关资源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。