javaWeb基础
文章目录
- 前言
- `本文是学习javaWeb时的一些知识点总结:`
- 一、配置tomcat环境变量
- 二、Servlet对象的生命周期
- 三,ServletConfig接口:
- 四,servletContext接口:
- 五,GET与POST
- get和post请求的使用时机:
- GET请求和POST请求的区别
- 六,HttpServletRequest接口
- 七,会话机制
- Session
- Cookie
- 八,JSP
- 九,EL表达式
前言
本文是学习javaWeb时的一些知识点总结:
一、配置tomcat环境变量
- JAVA_HOME=jdk的根
- CATALINA_HOME=tomcat服务器的根
- PATH=%JAVA_HOME%\bin;%CATALINA_HOME%\bin
二、Servlet对象的生命周期
- servlet对象的生命周期是由tomcat服务器负责
- 用户发送第一次请求的时候servlet对象被实例化,servlet对象被创建出来以后,tomcat服务器马上调用servlet对象的init方法,init方法执行以后,tomcat对象立马调用servlet对象的service方法
- 注意:无参构造方法和init方法只在用户发送第一次请求的时候执行,只执行一次
- 在以后发送请求后,servlet对象并没有新建,还是使用之前创建好的servlet对象,直接调用servlet对象的service方法
- 关闭服务器之后,Servlet的destroy方法被tomcat服务器调用一次。destroy方法执行的时候,servlet对象依旧存在,当destroy方法执行完成以后,sevlet对象才被tomcat服务器销毁
三,ServletConfig接口:
- ServletConfig对象被翻译为Servlet对象的配置信息对象,一个Servlet对象匹配一个配置信息对象
- ServletConfig对象包装的对象为web.xml文件中标签的配置信息
- ServletConfig的常用方法:
// 通过初始化参数的name获取value
public String getInitParameter(String name);
// 获取所有的初始化参数的name
public Enumeration<String> getInitParameterNames();
// 获取ServletContext()对象
public ServletContentext getServletContext();
//获取servlet的name
public String getServletName();
四,servletContext接口:
- ServletContext是由tomcat服务器实现的,并且是在服务器启动的时候创建的,ServletContext对象只有一个,在关闭服务器时ServletContext对象被销毁。
- ServletContext对象对应的是整个web.xml文件
- ServletContext接口中的常用的方法:
// 通过初始化参数的name获取value
public String getInitParameter(String name);
// 获取所有的初始化参数的name
public Enumeration<String> getInitParameterNames();
// 获取上下文的根
String path = application.getContextPath();
// 获取文件的绝对路径
public String getRealPath(String path);
// 记录日志
public void log(String message);
public void log(String message,Throwable t);
// 从servletContext中存
public void setAttribute(String name,Object value);
// 测试
User u = new User("jack",123);
application.setAttribute("userObj",user);
// 取
public Object getAttribute(String name);
//测试
Object userObj = application.getAttribute("userObj");
// 删除数据
public void removeAttribute(String name);
五,GET与POST
get和post请求的使用时机:
- 只有使用form表单,并且form表单中的method属性值为:method="post"使用post请求发送数据。
- 在浏览器地址栏上输入URL直接响应的都是GET请求,点击超链接的也是GET请求,使用form表单提交数据的时候没有method属性的时候都使用get请求。
GET请求和POST请求的区别
1.get请求发送数据的时候,数据会在URI后面,并且URI后面有个?,?后面为数据,get请求在请求行上发送数据
- post请求发送数据在请求体当中发送数据。
- 不论是get还是post请求,发送数据的格式是相同的,只是发送数据的位置不同
4.get请求只能发送普通的字符串,并且发送字符串的长度有限制。get请求是安全的,它只是为了从服务器上获取数据,并且支持缓存。
5.post请求可以发送任何类型的字符串,可以发送大数据量,它适合向服务器端发送数据,post请求不支持缓存
六,HttpServletRequest接口
- 用户发送请求的时候,遵循了Http协议,发送的说http的请求协议,tomcat服务器将http协议中的信息数据全部解析出来,服务器再将这些信息封装到HttpServletRequest对象当中。
- HttpServletRequest接口中的常用方法:
- 获取用户提交的数据:
ring getParameter(String name) // 获取value这个一维数组的第一个元素
Map<String,String[]> getParameterMap() //获取map
Enumeration<String> getParameterNames() // 获取map集合中的key
String[] getParameterValues(String name) //根据key获取map集合中的value
- 请求域对象
请求域对象比应用域对象范围小很多,生命周期短很多。请求域只在一次请求内有效。 - 请求域对象的常用方法
void setAttribute(String name,Object obj);
Object getAttribute(String name);
void removeAttribute(String name);
//其他常用方法:
// 获取客户端的ip地址
request.getRemoteAddr();
//设置请求体的字符集(tomcat10以后,request请求体当中默认的为:utf-8)
request.setCharacterEncoding("UTF-8"); // 处理post请求的乱码问题
//get请求处理乱码问题:get请求的数据出现在请求行上的,
get请求不会出现乱码,默认的URI的编码为utf-8
// 获取应用的根路径,使用次数较多
String contextPath = request.getContextPath();
// 获取前端的请求方式
String method = request.getMethod();
// 获取请求的URI 结果: /servlet/testRequest 带项目名
String requestURI = request.getRequestURI();
// 获取Servlet路径 结果: /testRequest 不带项目名
String servletPath = request.getServletPath();
域的选用原则:尽量选择小的域对象,因为占用的资源少
- 实现两个Servlet之间的数据共享
- 可以将数据放在请求域对象中,然后实现两个Servlet的跳转,保证两个servlet在同一个请求当中。
// 在Servlet01当中转发给Servlet02
// 第一步:获取请求转发器对象 (参数为path,也就是web.xml文件中的<url-pattern>标签对象)
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet02");
// 第二步:调用RequestDispatcher对象的forward()方法,进行转发
requestDispatcher.forward(request,response);
注意:转发的时候的path是以"/"开始,但是不加项目名
七,会话机制
Session
- 用户打开浏览器到最后关闭浏览器,叫做一次会话
- session是将会话状态保存在服务器端上
- request请求的生命周期太短不能保存会话状态
- session的实现原理(b站javaWeb老杜总结):
- 在web服务器中有一个session列表,类似于map集合。这个map集合的key存储的是sessionid,value存储的是对应的session对象
- 用户发送第一次请求的时候,服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器会将session的id发送给浏览器,浏览器将sessionid保存在缓存中
- 用户发送第二次请求的时候:会自动将浏览器中缓存的sessionid发送给服务器,服务器获取到sessionid,然后从session列表中查找对应的session对象。
- 关闭浏览器会话结束,浏览器中的保存的sessionid消失。重新打开浏览器之后,浏览器中没有这个sessionid,也就找不大对应的session对象,等同于会话结束。
- 使用java获取session对象。
// 从服务器当中获取session对象,如果session对象步存在,就新建一个session对象
Httpsession s = request.getSession();
// 作用:保存会话状态
// 向会话域当中绑定数据
session.setAttribute();
// 从会话域当中取出数据
session.getAttribute();
- session的手动销毁:
- session.invalidate();
- 安全退出,告诉服务器浏览器关闭
Cookie
- cookie最终保存在浏览器客户端上
- cookie是http协议的一部分,cookie是由name=value这种形式组成的,都是String。
- 例子:
Cookie k = new Cookie("proid","6564654");
例子:
Cookie c = new Cookie("proid","6544114858");
c.setPath("路径"); // 表示只要是这个路径下的请求路径都会提交cookie给服务器
c.setMaxAge(-1);
response.addCookie(c);
// 设置有效时间: 一个小时,没有设置有效时间,默认保存在浏览器运行内存中,只要设置了,cookie一定存储到硬盘文件当中
k.setMaxAge(60 * 60);
// 设置cookie的有限期为0,表示该cookie被删除,作用:删除浏览器上的同名cookie
k.setMaxAge(0);
// 设置cookie的有限期小于0,表示cookie不会被存储,不会存储在硬盘中,会保存在浏览器的运行内存中
- 通过request对象返回cookie数组:
Cookie[] cookies = request.getCookies();
// 注意:这个方法的返回null,如果浏览器没有提交cookie,这个方法返回值就是null
// 服务器程序接收cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c:
cookies) {
String name = c.getName();
String value = c.getValue();
System.out.println(name + "=" + value);
}
}
八,JSP
- jsp实际上为一个Servlet,jsp的生命周期与Servlet的生命周期完全一致
- 在浏览器上访问jsp文件的时候,实际上底层执行的是这个jsp文件的class文件。jsp文件会被服务器翻译为java文件,然后服务器又会将java文件编译为class文件。
- jsp和Servlet的区别:
- Servlet: 收集数据(逻辑处理,业务处理)
- jsp: 数据的展示
- jsp的基础语法总结
- jsp直接编写普通字符串:
- 翻译到service方法的out.write("这里");
- <% %>
- 翻译到service方法体内部
- <%! %>
- 翻译到service方法体的外部
- <%=%>
- 翻译到service方法体内部,翻译为out.print(); = <%=%>
- <%@page contentType="text/html;charset=UTF-8"%>
- page指令,contentType设置相应的内容类型
- jsp的指令
- 指令的使用语法:<%指令名 属性名=属性值 属性名=属性值%>
- page指令的常用属性:
<%page session="false"%>
jsp的内置对象session。true表示启动jsp的内置对象session,没有的话会创建session对象。如果为false,表示不启用session内置对象,并且无法使用内置对象
<%page contentType="text/html" pageEncoding="utf-8"%> contentType属性用来设置响应的内容类型
pageEncoding设置响应时采用的字符集
<%@page import=""%> 导包
<%@page errorPage="/error.jsp"%>
当前页面出现异常之后,跳转到error.jsp页面。指定出错以后的调转页面
<%--使用error.jsp跳转以后对我们开发人员就极不友好,所以使用9大内置对象之一:Exception--%>
<%@page isErrorPage="true" %> isErrorPage=true 确保Exception有效
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error page</title>
</head>
<body>
<h1>网络繁忙</h1>
<%
exception.printStackTrace(); <%--打印异常信息到后台控制台--%>
%>
</body>
</html>
九,EL表达式
- EL表达式的作用:
- 替带jsp文件中的java代码
- 从域中取出数据,转换为字符串,输出到浏览器
- EL表达式的语法:
- ${}
- EL表达式优先从小的域中取出数据
- pageContext < request < session < application
- 使用EL表达式的注意事项:
<%
request.setAttribute("username","张三");
%>
<%=request.getAttribute("username")%> = ${username}
<%
<%--可以存储引用类型的数据--%>
User user = new User();
user.setUsername("jack");
user.setPassword("123456");
request.setAttribute("userobj",user);
%>
${userobj.username} 底层调用的是:User对象的:getUsername();方法
<%--[] 没有加双引号的话,会将其看作变量。如果带双引号,就去user对象寻找username属性--%>
${userobj["username"]}
<%--在el表达式中指定范围来读取数据--%>
<%--四个隐式对象 pageScope,requestScope
sessionScope applicationScope
--%>
${pageScope.username}
${requestScope.username}
${sessionScope.username}
${applicationScope.username}
<%--EL表达式从Map中取数据--%>
${map.key}
<%--EL表达式从数组中取数据,不会出现数组下标越界的问题--%>
${ArrayName[下标]}
<%--EL表达式从集合中取出数据--%>
${myList[下标]} 会输出集合所有的元素,也可以使用下标
EL表达式对于NULL进行了预处理,在页面展示的时候为空白
- page指令忽略EL表达式
<%@page isElIgnored="true"%>
忽略整个页面的el表达式
<%--忽略其中某一个表达式--%>
\${username}
- EL表达式中的隐含对象
- pageContext
<%=pageContext.getRequest()%>
${pageContext.request} <%-- 获取request对象--%>
<%--通过EL表达式获取应用的根--%>
${pageContext.request.contextPath}
- param
<%--获取用户提交的数据 , 获取的是一维数组中的第一个数据--%>
用户名:${param.username }
- paramValues
<%--获取的是数组,采用【】取出数据--%>
爱好:${paramValues.aihao[0]}
- initParam
<%--获取servlet上下文对象--%>
${initParam.pageSize} pageSize是xml文件中的name属性中的值
- EL表达式中的运算符
- 加号运算符只能做求和运算,不能进行字符串的拼接
- EL中的 == 和 != 都调用了equals()方法
- empty 判断是否为空,为空结果为true,不为空结果围为false