华清远见重庆中心—JavaWeb总结/个人总结
HTTP状态码
常见状态码 | 说明 |
---|---|
200 | 成功 |
404 | 要访问的资源不存在 |
500 | 服务器内部错误 |
405 | 方法不允许 |
表单提交数据注意
-
表单如果是get方式提交,无法在action中使用?提交数据。
-
表单如果是post方式提交,可以在action中使用?提交数据
<!--只会提交username的值,action中?后的str无法提交--> <form action="URL?str=hello" method="get"> <input type="text" name="username"> <input type="submit"> </form> <!--参数都会提交,但地址栏只显示str,不显示username--> <form action="URL?str=hello" method="post"> <input type="text" name="username"> <input type="submit"> </form>
-
使用表单的隐藏域提交,无论get还是post方式,都能提交参数
<form action="URL?参数=值" method="post"> <!--该input不显示,但能提交str=hiddenStr--> <input type="hidden" name="str" value="hiddenStr"> <input type="text" name="username"> <input type="submit"> </form>
web.xml文件中常用标签
web.xml是web模块的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--设置欢迎页面-->
<welcome-file-list>
<!--页面路径-->
<welcome-file>login.html</welcome-file>
</welcome-file-list>
<!--设置全局错误页面-->
<error-page>
<!--如果遇到404状态码-->
<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>
<!--声明Servlet-->
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.hqyj.hero_sys.servlet.TestServlet</servlet-class>
<!--定义在该servlet中的初始化参数-->
<init-param>
<param-name>initParam</param-name>
<param-value>保存在该servlet中的字符串</param-value>
</init-param>
</servlet>
<!--映射Servlet-->
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<!--上下文参数,全局参数。以key-value保存-->
<context-param>
<param-name>contextParam</param-name>
<param-value>保存在全局的字符串</param-value>
</context-param>
<!--
配置过滤器,一个特殊的servlet
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern></url-pattern>
</filter-mapping>
-->
<!--配置session,会话-->
<session-config>
<!--设置会话超时时间-->
<session-timeout>5</session-timeout>
</session-config>
</web-app>
Servlet的生命周期
构造方法一次–>init()一次–>service()–>destroy()一次
在第一次访问某个servlet时,执行
1.构造方法一次
2.init()方法一次
3.有service()方法执行service()方法,没有则执行doXXX()方法,如果都没有,报405状态码,表示请求不允许
4.当服务器停止时,执行destroy()方法一次
JSP
Java Server Pages
使用Java开发,运行在服务器上的页面,称为JSP。
JSP页面的后缀名为.jsp
由于最初由Servlet编写页面,会在Servlet中出现大量的HTML代码,使用极不方便,
由SUN公司主导推出JSP,在HTML页面中嵌入Java代码,简化了页面的编写过程,页面也成为动态页面。
JSP实际是一个java类,具体为一个Servlet,第一次访问某个JSP页面,相当于编译运行Servlet,所以会慢一些。
访问JSP的流程:编译对应的Servlet–>运行Servlet。
JSP的生命周期同Servlet。
使用JSP时,可以导入该依赖,在JSP中方便提示
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
JSP的组成
1.HTML元素*
2.Java脚本*
<%
java代码;
%>
3.表达式*
用于在页面中输出变量或字符串。
无需分号。
<%=变量%>
4.注释
jsp注释在访问jsp时不会在浏览器中看到
html注释在访问jsp时会再浏览器中看到
<%--注释--%>
5.指令
<%@ 指令名 属性="值"%>
- page指令
- 用于设置当前页面的属性
- include指令
- 用于嵌入其他页面
- taglib指令
- 用于导入其他标签库
6.声明
可以在这里定义方法、全局变量等
<%!
void fun(){}
%>
7.动作
使用标签定义一些功能。
<jsp:单词></jsp:单词>
//包含另一张页面
<jsp:include page="路径"></jsp:include>
路径问题
绝对路径
完整路径
相对路径
-
/
从项目根目录出发。即域名+端口号
-
./
从当前位置出发
-
…/
退出当前目录后出发
Servlet/JSP to Servlet/JSP/HTML
请求转发
request.getRequestDispatcher("目的路径").forward(request,response)
- 使用请求转发跳转到目的地后,浏览器的地址栏是最初访问的路径
- 可以在请求转发时,在request对象中保存数据,如request.getParameter()、request.setAttribute()
- 在执行查询时,通常将查询后的结果保存在request对象中后,使用请求转发跳转到页面中
重定向
response.sendRedirect("目的路径");
- 使用重定向跳转到目的地后,浏览器的地址栏是最终访问的目的地路径
- 如果在重定向时使用request对象保存数据,后续无法获取保存的内容
- 在执行增删改后使用重定向跳转到目的地,防止重复提交
跳转过程中传递参数
-
由页面发送数据到servlet或jsp,通常使用表单元素或在某个URL后使用"?参数=值"方式提交参数,获取时使用request.getParameter(“参数”)获取
<a href="xxxx?id=11">删除</a> <form action="xxxx" > <input type="hidden" name="id" value="11"> </form> //返回值为String String str=request.getParameter("id");
-
由servlet发送数据到页面,使用request.setAttribute(String str,Object obj)保存obj到请求对象中,命名为str,获取时使用request.getAttribute(String str)
public class XXXServlet extends HttpServlet{ protected void service(HttpServletRequest req,HttpServletResponse resp){ List obj = new ArrayList(); req.setAttribute("list",obj); req.getRequestDispatcher("xxx.jsp").forward(req,resp) } }
<% //返回值为Object类型 Object obj = request.getAttribute("obj"); List list = (List) obj; %>
四大作用域对象
作用域:共享数据的区域。
如request就是一个作用域对象,request.setAttibute(String str,Object obj)在请求作用域中保存数据,request.getAttibute(String str)在请求作用域中获取数据
pageContext
当前页对象。共享数据的范围为当前页面。
如果不在一个页面,数据无法读取。
request
请求对象。共享数据的范围为一次请求。
只要请求不改变(不重定向),数据一直保存在请求对象中。
session
会话对象。共享数据的范围为指定的会话时间内。
默认会话超时为30分钟,表示如果30分钟没有对该站点进行访问,自动销毁会话。
application
应用程序(项目)对象。共享数据的范围为整个项目中。
作用域范围
最大到最小
application>session>request>pageContext
以上的作用域对象,都有这几个方法
//向作用域中保存数据 作用域对象.setAttribute(String str,Object ojb); //读取作用域中保存的数据 作用域对象.getAttribute(String str); //移除作用域中保存的数据 作用域对象.removeAttribute(String str);
在servlet中使用
-
pageContext
servlet中不会使用pageContext,它本身就是一个类,定义成员变量即可
-
request
使用doGet()/doPost()/service()等方法的HttpServletRequest参数即可
protected void service(HttpServletRequest req, HttpServletResponse resp){ //req即是request对象 }
-
session
protected void service(HttpServletRequest req, HttpServletResponse resp){ //通过req对象调用getSession()方法获取session对象 HttpSession session = req.getSession(); }
-
application
protected void service(HttpServletRequest req, HttpServletResponse resp){ //通过getServletContext()方法获取application对象 ServletContext application = getServletContext(); }
总结
- pageContext对象用于jsp页面中,保存的数据只能在当前页面使用
- request对象常用于servlet中保存查询后的集合,使用请求转发跳转到jsp页面中输出集合
- session对象常用于登录后保存登录的用户,在其他页面中共享用户对象
- application对象保存共享于整个项目中的数据
-
Ajax
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
任何的浏览器都支持ajax。通过原生的js使用ajax极不方便,这里使用jquery封装后的ajax使用。
使用
1.在页面中引入jquery文件
<script src="jquery文件路径"></script>
2.给某个节点绑定事件后使用ajax提交数据
<script>
$("#btn").click(()=>{
$.ajax({
//访问的地址
url:'URL地址',
//提交的数据,以键值对的形式提交,也可以提交单个数据
data:{
id:123,
op:"xxx"
},
//提交方式
type:"post",
//访问成功后的回调函数
succuss:(res)=>{//res为访问URL地址后的返回值
},
//访问失败后的回调函数
error:(res)=>{}
});
});
</script>
EL
Expression Language 表达式语言
是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。
主要输出保存在某个作用域中的数据。
特点
-
减少代码(获取对象、转换对象、获取对象属性)
-
如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,
在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。
会依次从pageContext–>request–>session–>application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。
也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。
-
-
免去非空判断
- 如果要使用的某个对象不存在,不会输出null,而是输出空字符串""
使用
1.获取保存在作用域中的对象
-
获取保存在某个作用域中的对象:${对象名}
-
从指定的作用于中获取对象
作用域单词 对应作用域 代码 pageScope 当前页pageContext ${pageScope.对象} requestScope 请求request ${requestScope.对象} sessionScope 会话session ${sessionScope.对象} applicationScope 项目application ${applicationScope.对象} -
输出对象的属性
${对象名.属性名} ${对象名["属性名"]} 要保证该属性有对应的get方法
-
输出对象的方法返回值
${对象名.方法名()}
JSTL
Java Server Page Standarded Tag Library JSP标准标签库
可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。
使用
-
导入jstl依赖
<!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
在JSP页面中,加入标签库指令
<!--在当前页面中使用jstl,以c为标签前缀--> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这句话可以在使用循环时自动生成
-
具体使用
-
定义变量或给变量赋值
<c:set var="变量名" value="值"></c:set> <c:set var="name" value="admin"></c:set>
-
if判断
<c:if test="判断条件"> 满足时执行 </c:if> session.setAttribute("user",用户对象); <c:if test="${empty user}"> <span>请登录</span> </c:if> <c:if test="${!empty user}"> <span>${user.username}</span> </c:if>
-
遍历List集合
//如在servlet中,将查询到的集合保存在request对象中 request.setAttribute("list",查询到的集合) <table> <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">--> <c:forEach items="${list}" var="obj"> <tr> <td>${obj.属性}</td> </tr> </c:foreach> </table>
-
遍历Map集合
<% HashMap<String,String> hm = new HashMap(); hm.put("yyds","永远单身"); hm.put("awsl","阿伟死了"); hm.put("u1s1","有一说一"); application.setAttribute("hm",hm); %> <c:forEach items="${hm}" var="kv"> <%--${键值对.key} 获取键 ${键值对.value} 获取值 --%> <h2>${kv.key}--${kv.value}</h2> </c:forEach>
-
JSP内置对象
在JSP中,可以不用定义,就能直接使用的对象,称为内置对象。
一共有9个内置对象
“rrppsoace”
-
pageContext
作用域对象,当前页面作用域。
-
request
作用域对象,请求作用域。
-
session
作用域对象,会话作用域。
-
application
作用域对象,项目作用域。
-
response
响应对象
-
out
输出对象,相当于Servlet中的response.getWriter()方法的返回值对象
-
page
表示当前页面自身对象,相当于servlet中的this
-
config
配置对象,获取servlet的配置信息
-
exception
异常对象,只能使用在有isErrorPage="true"声明的jsp页面中,用于获取异常对象
Session和Cookie
session
session称为会话,是一个作用域,使用session.setAttribute()保存数据,使用session.getAttribute()获取数据。
默认session会话有效期为30分钟,可以更改,超时或关闭浏览器,session失效。
保存在session中的数据,可以在同一个站点下的不同页面中共享。
session共享数据的原理
-
访问任意JSP页面时,默认都会创建一个JSESSIONID(可以取消自动创建),是一段session编号,保存在一个cookie文件中
<%--所有jsp页面中,默认开启了session--%> <%@ page session="true"%> <%--让页面默认不使用session--%> <%@ page session="false"%>
自动生成的cookie文件信息,可以看出,随着浏览器关闭,session到期
-
再次访问该页面时,会查询JSESSIONID是否存在,如果存在,直接使用,如果不存在,重新创建新的JSESSIONID
-
保存该JSESSIONID的cookie文件,有效期为浏览会话结束。所以关闭浏览器,session失效
session对象常用方法
常用方法 | 说明 |
---|---|
getAttribute(String str) | 获取session中保存的数据,返回值为Object类型 |
setAttribute(String str,Object obj) | 将obj保存在session中,命名为str |
removeAttribute(String str) | 移除保存在session中的对象str |
invalidate() | 销毁session |
getId() | 获取JSESSIONID |
getMaxInactiveInterval() | 获取session有效时长,单位为秒,默认为1800 |
setMaxInactiveInterval(int second) | 设置session有效时长,单位为秒 |
getCreationTime() | 获取session创建时间,返回值为时间毫秒 |
getLastAccessedTime() | 获取最后一次访问session的时间,返回值为时间毫秒 |
设置项目全局session有效时长
在web.xml文件中设置,单位为分钟
<!--设置项目中所有session的有效时长,单位分钟-->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
cookie
cookie是一个用于保存数据的对象,实际是一个保存在客户本地的文件。关闭浏览器,cookie依然存在。手动清理或自动超时清理后,数据随之消失。
cookie通常用于更久地保存数据,即便关闭浏览器,也能一直存在。如登录信息、购物车信息等
cookie中保存的数据有上限(4kb),
cookie在浏览器中保存的数量也有上限(30~300根据浏览器不同略有变化)。
创建cookie
//Cookie(String name,String value);
Cookie ck = new Cookie("str","hello");
//设置有效时长,单位为秒,如果不设置,关闭浏览器,cookie失效
ck.setMaxAge(7*24*3600);//7天
保存cookie
response.addCookie(ck);
遍历cookie
Cookie[] cks = request.getCookies();
for(Cookie ck : cks){
ck.getName();//获取name
ck.getValue();//获取value
}
session和cookie的对比
-
session中保存的数据可以是任意类型,没有大小限制;cookie中保存的是键值对,单个值大小上限为4kb
-
session中保存的数据存在服务器中,cookie中保存的数据存在浏览器中。
-
session到期或随着浏览器关闭而失效,cookie如果设置了有效时长,即使关闭浏览器也会存在,在到期或手动清理时失效