B/S模式 和 C/S 模式
B/S模式
全称
Browser/Server浏览器/服务器模式
工作方式
用户只需要一个浏览器即可访问服务器。
C/S模式
全称
Clint/Server客户端/服务器模式
工作方式
用户需要下载客户端才能访问服务器。
JavaWeb
JavaWeb是什么?
是使用Java开发Web服务的技术,统称为JavaWeb。
JavaWeb的实质
就是B/S模式下的软件开发,开发综合性的服务网站。
Tomcat的特点
免费、开源、轻量级,在中小型系统中普遍被使用。
官网
Maven
Maven是什么?
用于结构化管理jar文件的工具。
原理
通过在Maven项目中加入某个jar文件的依赖,让其自动从Maven云仓库中下载对应的jar文件。
使用IDEA创建基于Maven的Web项目
步骤
- 新建webapp模板。
- 设置项目名称和路径。
- 3.设置Maven配置文件。
- 从Maven云仓库中搜索所需的jar文件。
- 粘贴到项目中的pom.xml文件中的dependencies标签中。
- 在src目录下新建编写类的java目录。
- 修改项目的web.xml版本为4.0。
- 配置tomcat服务器。
- 部署创建好的项目到Tomcat服务器中。
- 验证创建及配置是否成功。
HTTP状态码
作用
用特定数字表示状态。
常见状态码
状态码 | 说明 |
200 | 成功 |
400 | 资源未找到 |
500 | 服务器内部错误(就是服务端的代码问题) |
405 | 方法不允许 |
Servlet
Servlet是什么?
Server+Applet 运行在服务器上的程序。
创建步骤
- 在项目中导入Servlet相关依赖。
- 在项目的java目录下,创建一个类,继承HttpServlet,重写doGet和doPost方法。(也可以直接创建service()替代这两个方法,但两者不能共存)。
- 在web.xml中设置Servlet的请求映射。
- 访问Servlet验证是否配置成功(启动tomcat服务器,访问"项目上下文地址/first")。
三层架构
高类聚
指每个模块内的功能不可再分。
低耦合
是指降低各个模块之间的关联程度,这样便于开发和维护,每个模块各司其职。
通常的三层架构
- 数据访问层
数据访问层,用于连接数据库,对数据做增删改查的操作。- 业务逻辑层
业务逻辑层,用于处理业务逻辑,在适当的情况下调用数据访问层中的方法。- 视图表现层
视图表现层,用于展示数据和提供用户输入数据的渠道,在适当的情况下调用业务逻辑层中的方法
获取从页面传过来的数据
//此处接受的是提交表单里有“username”的input数据(参数)
String username = req.getParamter("username");
访问方式
GET
使用这种方式提交的数据暴露在地址栏中,且数据长度有限。
- 在浏览器的地址栏中输入对应的URL。
- 使用a标签,在href中输入对应的URL。
- form表单提交方式:method = “get”。
Post
使用这种方式提交的数据不会显示在地址栏中,并且数据长度不受限制。
- form表单提交方式:method = “post”。
页面提交数据的方式
- 使用form表单的name属性显示提交(不安全)。
- 使用form表单的name属性隐式提交,也就是把input标签的tyep属性改为"hidden"(安全)
- 通过"?参数名=值"方式提交,有多个参数时用&连接
//链接也可以直接在地址栏中访问
<a herf="http://localhost:8080/项目名/访问页面?参数1=值1&参数2=值2">跳转</a>
注意:
4. 获取方式都用"req.getParamter(“参数名”)"。
5. 表单通过action提交设置的路径,如果要在路径中传递参数,只能使用post方式提交(因为get方式无法识别,建议用隐藏域)。
解决请求和响应的中文乱码
//用于在servlet中doGet()和doPost()
req.setCharacterEncoding("utf-8");
resp.setConttentType("text/html;charset = utf-8");
web.xml文件中常用的标签
- 设置项目启动的欢迎页
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
- 设置错误页面
<error-page>
<!--错误码-->
<error-code>404</error-code>
<!--页面路径-->
<location>/404.html</location>
</error-page>
<error-page>
<!--异常类型-->
<exception-type>java.lang.NullPointerException</exception-type><location>/error.html</location>
</error-page>
- 设置全局参数
<context-param>
<!--参数名-->
<param-name>contentParam</param-name>
<!--参数值-->
<param-value>全局参数</param-value>
</context-param>
Servlet的生命周期
基本过程
- 构造方法
- init()
- service()/doGet()/doPost()
- destory()
详细过程(访问servlet时)
- 执行构造方法一次。
- 初始化一次,调用init()方法。
- 调用service()方法,之后每次访问都会调用该方法。有该方法时,doGet和doPost失效。(如果没有该方法,会根据请求方式试图调用doGet或doPost,如果没有相应的方法,会出现405状态码,表示请求方式不允许)。
- 在当前servlet所在项目从tomcat中停止时,销毁一次,调用destory()方法。
用注解开发Servlet
//@WebServlet("/请求映射")
@WebServlet("/bookInfo")
JSP
什么是JSP
Java Server Page,使用Java开发、运行在服务器上的页面。
用途
可以在页面中加入java代码,让页面成为动态页面。
本质
是一个java文件(servlet)。
访问过程
- 第一次访问时,页面会重新编译为.java文件再到.class文件.(这会导致第一次访问速度过慢)。
JSP的组成
- HTML元素
- 脚本(java代码)
<%java代码%>
- 表达式(用于在页面中嵌入变量的值)
<%=变量%>
- 指令
<%@ 指令名 属性=“值”%>
- 注释(在浏览器中无法被查看)
<%–jsp注释–%>
- 声明(方法)(不建议使用太多,影响代码阅读性)
<%! 定义方法 %>
- 动作(定义一些标签可以代替java代码)
< jsp:动作名></jsp:动作名>
跳转
页面与页面之间跳转
//用于事件跳转
localtion.href(“页面地址”)
页面跳转至Servlet
<a href="servlet映射名"></a>
<form action="servlet映射名">
<input type="submit"></form>
Servlet跳转到页面或另一个Servlet
- 请求转发(内部跳转)
//此方法,能够修改request域中保存的数据(对象)
request.getRequestDispatcher("跳转的地址").forward(request,response);
- 重定向(外部跳转)
response.sendRedirect("跳转的地址");
跳转时传递数据
- 保存
作用域对象.setAttribute(Stringstr,Objectobj);
- 获取
Objectobj=作用域对象.getAttribute(Stringstr);
//获取到的数据是Object类型,通常需要转型(例如)
List<泛型>list=(List<泛型>)request.getAttribute("list");
带有外键字段的实体类设计
创建实体时,需要将外键对应的主表实体对象也加入属性中。
MySQL分页查询
获取每页的指定数据
--公式size表示每页显示的数量page表示页数
select * from 表 limit(page-1)*size,size
获取总记录数据条数
select count(属性)from 表
条件分页(关键字搜索)
原理
select * from 表 where 字段 like concat('%',keyword,'%')limit(page-1)*size,size
路径
绝对路径
根目录/项目名/页面路径
相对路径
- /
表示从根目录(域名+ip)出发。
- ./
表示从当前位置出发。
- …/
表示跳向上一层
页面上下文路径
${pageContex.request.contextPath}
关于EL无效识别的问题
- 在<%@ page%>中加入isELIgnored=“false”。
- 替换web.xml版本为4.0以上(默认isELIgnored=“false”)
四大作用域对象
用途
共享数据
- pageContext
- 当前页面对象。共享数据区域范围为当前页面。
- 如果不在同一个页面,数据无法读取。
- request
- 请求对象。共享数据区域范围为一次请求。
- 如果跳转中途使用了重定向,数据无法读取。
- session
- 会话对象。会话是用户访问服务器时的某个时间段。
- 共享数据区域范围在这个时间段内,默认30分钟。
- 如果在指定时间内没有操作或销毁会话时,数据无法读取。
- application
- 项目对象。共享数据区域范围为整个项目。
作用域范围比较
application > session > request > pageContext
共同方法
//将某个对象obj保存到作用域中,命名为str
作用域对象.setAttribute(String str,Object obj);
//从某个作用域中获取保存的某个对象
Object obj=作用域对象.getAttribute(String str);
//从某个作用域中移除某个保存的对象
作用域对象.removeAttribute(Stringstr);
使用
- 在JSP页面中
作用域对象也称为内置对象,直接通过对应的单词使用
如
<% request.setAttribute("str","保存在request中的字符串");
%>
<%=request.getAttribute("str")%>
- 在servlet中使用
- pageContext (在servlet中不会使用pageContext对象)
- request(使用doGet/doPost/service方法中的HttpServletRequest参数req)
- session( HttpSessionsession=req.getSession();
- application(ServletContextapplication=getServletContext();
EL
什么是EL表达式
Expression Language表达式语言
是为了使JSP写起来更加简便,替换JSP中的<%=%>,简化了JSP页面中输出数据的操作。主要输出保存在某个作用域中的数据。
特点
- 只能输出保存在作用域中的对象。
- 减少代码(省去了获取对象、转换的过程)。
- 免去非空判断。
使用
在页面中输出保存在作用域中的对象
- 从作用域中依次查询并输出对象
${对象名}
- 从指定作用域中输出对象
- pageScope
- 当前页pageContex
- ${pageScope.对象}
- requestScope
- 请求request
- ${requestScope.对象}
- sessionScope
- 会话session
- ${sessionScope.对象}
- applicationScope
- 项目application
- ${applicationScope.对象}
- 输出对象的属性
${对象名.属性名}
${对象名[“属性名”]}
- 输出对象的方法返回值
${对象名.方法名()}
在页面中获取请求中的参数
//传统方法
request.getParameter(“username”)
//EL表达式
${param.username}
JSTL
什么是JSTL
Java Server PageStandarded Tag Library JSP标准标签库。
作用
可以使用JSTL中的特定标签,来替换JSP中常见的Java代码。如循环判断等,减少Java代码,提高页面的可读性。
使用
- 导入JSTL对应的依赖。
<dependency>
<groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version>
</dependency>
- 在JSP页面中,加入标签库指令
<%--在当前页面中使用jstl,加入以下指令--%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
- 具体用法
- 定义变量或给变量赋值
<c:set var="变量名" value="值"></c:set>
- if判断
<c:if test="判断条件">
满足条件时的内容
</c:if>
- 遍历List集合
<c:forEach items="要遍历的集合"var="遍历出的对象名"></c:forEach>
- 遍历Map集合
<c:forEach items="要遍历的集合名"var="遍历出的键值对的名称">
${键值对名.key.属性}
${键值对名.value.属性}
</c:forEach>
Ajax
什么是Ajax
- AsynchronousJavascriptAndXML
- 异步JavaScript和XML
- 一种数据交互方式,请求和响应是异步的。
- 使用ajax能实现在整个页面不重新加载的情况下,更新局部内容。
使用
使用jquery封装后的.get() $.post()等函数。
- 在页面中导入jquery文件
<!--使用Ajax,需要导入jquery-->
<scriptsrc="jquery文件路径"></script>
- 在script标签中写ajax
<script>
某个节点.事件(function(){
//使用ajax异步提交数据
$.ajax({
//访问的URL地址
url:"servlet映射或具体url",
//提交的数据
data:{
//键:值
"形参":值,
"形参":值
},
//提交方式
type:"get/post/put/delete",
//成功访问URL后的回调函数
success:function(res){//res表示访问URL后返回的数据
},
//访问URL失败时的回调函数
error:function(){
}
});
});
</script>
JSP内置对象
在jsp页面中有一些对象是已经定义好了可以直接使用的,称为内置对象。
- request
- 请求作用域对象
- response
- 响应对象
- pageContext
- 当前页作用域对象
- session
- 会话作用域对象
- page
- 当前jsp页面对象
- out
- 输出对象
- application
- 项目作用域对象
- config
- 配置对象
- exception
- 异常对象
Session和Cookie
都是用于保存数据的对象。
Cookie
cookie通常用于更长时间地保存一些信息,即便关闭浏览器,也能保存。
创建
//创建cookie
Cookiecookie=newCookie("username","保存在cookie中的用户名");
//设置有效时长,单位为秒,这里表示7天有效
cookie.setMaxAge(60*60*24*7);
//通过响应对象response保存cookie对象到本地
response.addCookie(cookie);
获取
//读取cookie时是获取当前站点的所有cookie数组
Cookie[]cks=request.getCookies();
//遍历
for(Cookieck:cks){
System.out.println(ck.getName()+"--"+ck.getValue());
}
Session
- session是一个作用域对象,在访问任意jsp页面时,默认就会创建一个session对象(可以通过设置取消自动创建)。
- 通常使用session保存一些信息,用于在同一站点的各个页面之间共享数据。
原理
- 当访问的jsp页面或servlet中使用了session,会创建一个JSESSIONID(session编号),这是一个字
符串,保存在一个cookie中。
- 默认访问某个jsp页面时,该页面中没有使用session,也会自动创建session
<%--默认每个jsp页面都有这句话,表示访问该页面时,自动使用session--%>
<%@page session
="true"%>
- 再次访问该页面时,会查询该JSESSIONID是否存在,如果存在,直接使用,如果不存在,创建新的JSESSIONID。
- 保存该JSESSIONID的cookie会随着浏览器的关闭自动销毁,所以关闭浏览器,session就会失效。
常用方法
常用方法名 | 作用 |
session.setAttribute(String str,Object obj) | 将obj对象保存在session中,命名为str |
session.getAttribute(String str) | 获取保存在session中的对象 |
session.removeAttribute(String str) | 移除保存在session中的对象 |
session.invalidate() | 销毁session |
session.getCreationTime() | 获取session创建时间对应的毫秒数 |
session.getId() | 获取JSESSIONID |
session.getMaxInactiveInterval() | 获取session有效时长(默认1800秒) |
session.setMaxInactiveInterval(int seconds) | 设置session有效时长,参数为秒 |
ServletContext app = session.getServletContext(); | 获取当前application对象 |
设置全局session有效时长
在指定时间内,打开浏览器但对session无操作,就会自动销毁session。
方法
- 通过session.setMaxInactiveInterval(int seconds)设置有效秒数。
- 在web.xml中配置。
<!--设置全局session配置-->
<session-config>
<!--session有效时长,单位为分钟-->
<session-timeout>15</session-timeout>
</session-config>
Session VS Cookie
- session中保存的是对象Object,cookie中保存的是字符串String,都以键值对的形式保存。
- session保存在浏览器和服务器端,cookie保存在浏览器。
- session保存的数据没有大小限制,cookie保存的数据有大小限制,不超过3KB。
- session在30分钟内没有访问或随着浏览器的关闭而销毁,cookie可以设置销毁时间。
监听器Listener
作用
用于在执行某个操作时,通过监听器同时再执行其他操作,如记录日志、统计站点人数等。
常用的三个监听器接口
实现接口名 | 监听器 |
ServletContextListener | application监听器 |
HttpSessionListener | session监听器 |
ServletRequestListener | request监听器 |
配置监听器
- web.xml中
<!--配置监听器-->
<listener>
<!--设置监听器的全限定名-->
<listener-class>com.hqyj.bookShop.listener.MyListener</listener-class>
</listener>
- 注解形式
@WebListener
过滤器Filter
用于拦截访问,防止非法访问。
配置Filter
- web.xml中配置
<!--声明过滤器-->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.hqyj.filter.MyFilter</filter-class>
</filter>
<!--设置什么请求要经过该过滤器,通常过滤所有请求-->
<filter-mapping>
<filter-name>myFilter</filter-name>
<!--/*表示过滤所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
- 注解配置
@WebFilter("/*")
个人总结
在这个阶段中,回顾了之前学过的知识,同时又学习了很多新的内容,特别是将关于这个阶段的内容进行灵活运用到实际应用中,很明显的感觉到了很大的进步,对于基本的JavaWeb开发模式加深了很多印象,模块化的思维越发变得清晰,期待后面阶段学习的知识和能力的增多和加强。Good Luky!