前端和后端数据交互
前传递后
1 form:
name:参数
submit:提交
action:网址提交
2 通过模板引擎(jsp,thymeleaf)语法定义到类路径进行超链接
后传递前:
1 通过模板引擎显示
2 将视图,字符串等用response返回
resource资源分类
静态资源:不需要查数据库也不需要程序处理,直接就能够显示的页面
动态资源:需要程序处理或者从数据库中读数据,能够根据不同的条件在页面显示不同的数据
Servlet
流程:
建一个继承HttpServlet的Servlet类,重写doGet和doPost方法,方法中实现接收,业务和视图跳转
在web.xml中配置servlet,在pattern中写入地址
完成跳转页面
response
remote Address:显示对面ip
Host:域名
req,resp
关于req.getRequestDispatcher()和resp.senddirect("/")
1 前者不改变地址栏,携带参数直接前往页面
2 后者改变地址栏,返回页面位置给客户让其重新请求,故原数据消失
req.getParameter和req.getAttribute
getParameter只能获得string值,常用于jsp的表单
仅有setAttribute之后才能getAttribute
req和resp中文乱码
req/resp.setCharacterEncoding仅对于请求内的文字有效,所以过滤器可以替代,但jsp里本来的文字需要通过以下代码解决乱码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
resp.setHeader和resp.addHeader
都用于通知客户端浏览器为服务当前响应做出举动,如要下载文件时会通知浏览器以附件方式用utf-8解读文件名来准备解读io数据,下载下来文件
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
但resp.setHeader()遇到相同名称Header时会覆盖,而后者只会加入
关于setAttribute和getAttribute注意技巧
1 几个web类都有这些方法,根据不同作用域所需选择不同对象调用
2 在使用中,很可能出现很多页面用到同一个属性,建个util包,将其赋给一个常量,可以很好地减少对相同变量的修改
@RequestParam()
等同于getParameter
不同路径指向
request.getRequestURL() 返回全路径
request.getRequestURI() 返回除去host(域名或者ip)部分的路径
request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
request.getServletPath() 返回除去host和工程名部分的路径
例如:
request.getRequestURL() http://localhost:8080/jqueryLearn/resources/request.jsp
request.getRequestURI() /jqueryLearn/resources/request.jsp
request.getContextPath()/jqueryLearn
request.getServletPath()/resources/request.jsp
https://blog.csdn.net/kaikaixinxiyiwannian/article/details/78732410
当一个项目有多个web型模块
resp.senddirect("/"):指向当前项目根地址,不会指向web模块根地址,请注意在输入url前加入"/",不然会指向错误地址
this.getServletContext().getRealPath:(idea)指向target文件夹/模块名文件夹
${pageContext.request.contextPath}:指向web模块根地址
req.getRequestDispatcher():指向web模块根地址(有/和无/相同)(req.getContextPath()用于查找当前所处相对路径)
Session
session消耗大,没有必要validate,可以多通过removeAttribute(Session().getId)来销毁存在凭据,达到重新使用的目的
JSP
JSP原理
JSP本质上是一个servlet,这一点可以在C盘user\idea\Tomcat\system\work\Catalina\localhost\project\org\apache\jsp下每一次对jsp的请求,服务器会把jsp文件夹更新(作者发现servlet和.class的修改日期并不是今天,所以很可能服务器也是从其他地方取这些东西),将jsp翻译为servlet(这一次没有用过服务器),再将编译后的class版本发回客户端
JSP语法
表达式
<%= >
会在service()方法中输出out.print
脚本
<% >
service方法会在相应位置原封不动地复制一份一样的
声明
<%@ >
声明的东西会出现在对应servlet类的顶端
三种必知声明
复合使用:根据service()相应位置可以把html标签,脚本和表达式型标签合起来使用
注释
<%-- --%>
九大内置对象
九大对象被声明在service()方法中,所以可以直接调用
out 用于输出
config是ServletConfig别名,极少使用
response
page类似于java的 this ,极少使用
exception用于输出异常
以下四个内置对象用于存储:
pageContext 当前页面有效
request 一次请求内有效
session 直到手动销毁或关闭浏览器失效
application是ServletContext的别名 直到服务器关闭失效
jsp必知标签
<jsp:include page=" ">
<%--req.getRequestDispatcher("/").forward(req,resp)--%>
<jsp:forward page="">
<jsp:param name="" value=""/>
</jsp:forward>
EL标签
作用:
获取对象,获取数据,获取表达式值
<%--经典案例:用于指定到web项目根目录--%>
${pageContext.request.contextPath}
注意:Attribute可以通过{xxScope.get("")}获得,也可以直接填变量名从小作用域到达作用域查询,但jsp表单提交的数据需通过${param.get("")}获得
JSTL标签库
分类
核心标签(唯一需要掌握)
格式化标签
SQL标签
XML标签
使用引入
1 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
(这个仅用于导入核心标签,其余标签细节改动,根据版本标签略有变化)
导入
2 maven项目和Tomcat/lib分别添加standard和jstl-api
核心方法案例(取自狂神说)
<c:if test="${param.username==''"}" var="">
<c:set var="score" value="98"/>
<c:choose>
<c:when test="${score>=90}">
你的成绩为优秀
</c:when>
<c:when test="${score>=80}">
你的成绩为一般
</c:when>
<c:when test="${score>=70}">
你的成绩为良好
</c:when>
<c:when test="${score<=60}">
你的成绩为不及格
</c:when>
</c:choose>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
MVC架构图
filter
发生在客户端和服务器端,优先于控制层
同一页面实现不同功能地过滤应用多个过滤器,而不是放在同一个,如把中文乱码分离成一个过滤器,和把服务于相同页面的不同功能也给分离成多个过滤器。
过滤器的优先级由在web.xml的顺序决定
拦截器
错误示范:
在true时跳转页面,false时默认进行,这样会让控制层失效
正确:如果页面正确应返回true,让其自动进入控制层,错误时跳转到应该的页面