web入门学习总结

web学习

Servlet总结:
运行在服务器端Java程序(或者简说为一个Java类),是javaweb的三大组件之一(Servlet、Filter、Listener)
需要掌握Servlet中的doGet和doPost方法,其他直接继承httpservlet中的service方法即可。

内容:
项目方法:
getServletConfig();------------------------------获取配置对象
getServletContext();-----------------------------获取项目的上下文(全局管理者)ServletContext对象
上下文对象ServletContext的方法(作用):
getAttribute("**");------------------------------获取指定键的值
setAttribute("**","**")--------------------------为指定键赋值
removeAttribute("**")----------------------------移除值
getMimeType(文件名)------------------------------获取文件的mime类型
getResourceAsInputStream("文件的getRealpath路径");------获取指定服务器文件的输入流
getInitParameter("key");-------------------------获取全局初始化参数(框架用)
getRealpath("***")-------------------------------获取指定项目路径

response(封装了响应信息的对象)方法:
响应行:
setStatus(状态码);
响应头:
★setHeader(String key,String value)-------------设置字符串形式的响应头
常用头:<1.content-type(设置文件的mime类型,并通知浏览器用什么编码打开)
例:response.setHeader("content-type","text/html;charset=utf-8");
<2.location(重定向,需要配合状态码使用)
例:response.setStatus(302);
response.setHeader("location","/day01/helloServlet");
<3.content-disposition(文件下载专用头)
例:response.setHeader("content-disposition","attachment;filename="+love.jpg);
★对应升级版
<1.setContentType("**");
例:response.setContentType("text/html;charset=utf-8");
response.setContentType(mimeType);
<2.sendRedirect("url");
例:response.senRedirect("/day01/helloServlet");
相应体:
常用方法:
getWriter();-------------------------------------字符流(常用于页面网页显示)
getOutputStream();-------------------------------字节流(常用于文件下载)


request(封装了请求信息的对象)方法:
★getRequestDispatcher("servlet路径")------------获取请求转发对象
setAttribute();----------------------------------设置属性,封装值
getAttribute();----------------------------------获取属性值
请求行:
★getContextPath()-------------------------------获取当前项目的根目录项目名(/day01)
getMethod()--------------------------------------获取http请求方式
getRemoteAdd-------------------------------------获取客户端的IP
请求头:
(使用String getHeader(String key))
★referer----------------------------------------获取当前用户使用什么浏览器(防盗链)
★user-agent-------------------------------------获取当前页面的上一个页面地址,若没有则为null(下载)
请求体:
(存放post请求的请求参数)
★Map<String,String[]>getParameterMap()----------获取表单的所有提交信息(配合BeanUtils超级好用)
★String getParameter(String name)---------------单一的值
★String[] getParameterValues(String name)-------多个值(CheckBox专用)


会话技术:
cookie:
(服务器手动)创建:
Cookie cookie = new Cookie("cookieName","cookieValue");
传递:
response.addCookie(cookie);
获取(常用API):
getCookies();-->名称遍历cookie.getName()-->值判断cookie.getValue()
浏览器(自动):接受cookie-->保存cookie(存在key值覆盖)-->传递cookie

注:
<1.cookie的键值对只能是字符串,其setMaxAge(*)可设置会话级别,-1默认浏览器开启,0立即过期,>0单位为秒的时间
<2.cookie保存是有限制的,value最多保存4kb内容,不能想cookie中存储大数据,一个网站一个项目最多向一个浏览器保存30个cookie(建议)
<3.cookie不仅仅是javaee技术,还是asp,php,android的技术,因为cookie是http协议指定
<4.cookie不能直接存储中文,不过可以编码存储(张三---urlencode---utf-8---cookie---urldecode---张三)
<5.cookie的有效路径,在当前项目下,setPath()可进行设置

session:
(保存在服务器端的会话技术)
创建:
HttpSession session=request.getSession();
赋值:
session.setattribute(key,value);
获取:
session.getAttribute(key);

其他API:session.getId()--------------------返回session的jsessionid
session.invalidate()---------------主动销毁session对象

注:session(私有),request(公有),servletContext(公有)为三大域对象,而cookie不是域对象,因为他没有setXxx和getXxx
session底层依赖cookie

面试重点:

生命周期:

cookie:
默认:会话级别cookie,浏览器与服务器建立会话开启,直到浏览器关闭cookie销毁
设置:持久化级别,setMaxAge(秒),不论浏览器开启还是关闭,在设置时间内cookie一直存在,直到时间到期,cookie销毁

session:
创建:Java认为,当第一次执行request.getSession()会在服务器内存中创建按session
销毁:主动销毁;服务器非正常关闭(session的自动过期时间为30分钟,过期后销毁)

总结反馈:一个servlet中执行了♥重定向或者请求转发♥后,该servlet中后面的方法将不能执行,最好加上return来结束doGet/doPost方法,不然后面极有可能出错!!!!
当浏览器设置了消除cookie之后,session就不能依赖cookie进行JsessinId的获取,可以在每个请求页面的超链接中使用src/href=response.encodeURL(String url); 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


·····························································································
综合方法模板:
文件下载(设置两个头,两个流):
String filename=request.getParameter("filename");·······························获取文件名称
response.setHeader("content-disposition","attachment;filename="+filename);······设置下载头
ServletContext scon=getServletContext();........................................获取全局管理者
String mimeType=scon.getMimeType(filename);·····································获取文件mime
response.setContext(mimeType);··················································设置第二个头(升级版)
InputStream is=scon.getResourseAsStream("/down/"+filename);·····················获取服务器指定文件流★(路径获取相当于getRealpath)
OutputStream os=response.getOutputStream();·····································获取响应输入流
IOUtils.copy(is,os);····························································工具类进行流对拷
is.close();
os.close();
································································································

·······························································································
乱码问题的处理总括:
response.setContentType("text/html;charset=utf-8");····························解决浏览器显示乱码
request.setCharacterEnconding("utf-8");········································解决post方式提交到控制台的乱码
new String(filename.getBytes("iso8859-1"),"utf-8");····························解决get方式提交到控制台乱码
URLEncorder.encode(filename,"***");············································解决下载头设定显示的乱码问题
·······························································································

Jsp的总结:

★jsp指令:
格式:<%@指令名 属性1="值1" 属性2="值2"... %>
标签快捷键:ctrl+shift+/
分类:
page:(alt+/导报和提示)
属性:
improt:导入jar包
contentType和pageEncoding:设置页面的编码,两个都有使用各自;只有一个,二者同一;都不出现,默认iso-8859-1
errorPage:当页面出现错误后,跳转到该属性页面上(地址)
isErrorPage:当前页面是否是错误页面(默认false),当为true是时可以使用exception这个内置对象
session:当前页面是否可以使用session对象
language:声明当前jsp支持的脚本语言(目前只有Java)

include:
属性:
*file:静态包含(file="项目内部jsp之间的url",生成一个Java文件)
taglib:(导入标签库)
属性格式:
<%@ taglib prefix="前缀名" uri="名称空间"%>
注:jsp页面可以使用多个指令,指令可以出现多次,位置任意,一般在页面的上面


★jsp内置的9大内置对象:

内置对象 类型
request HttpServletRequest(使用同servlet)
session HttpSession ..
application ServletContext ..
out JspWriter (jsp的字符输出流,底层走的走的是response.getWriter.print()(流中若有数据,自身的流先输出,然后再输出out的流)))
page Object ..
config ServletConfig ..
response HttpServletResponse ..
exception Throwable (必须在jsp页面声明一个属性才能用)
PageContext PageContext (jsp的最小的域对象,一般不存数据,但是了解其方法的作用)

注:只要访问一次jsp就会创建9大内置对象
PageContext功能详解:
<1.可以获取其他八大内置对象(一般不用,因为我们可以直接拿来用)
<2.可以从别的作用域中查找数据(一般不用,因为我们可以直接在指定的作用域里面查找)
pageContext.findAttribute(String name); -------------(获取对应的值)
作用域:
从小到大开始找:
pageContext
request
session
ServletContext
可以操作其他作用域:
pageContext.setAttribute("msg","123",pageContext.SESSION_SCOPE);
等同于:session.setAttribute("msg","123");
...

★★域对象
jsp域对象 servlet域对象 作用域
request request 一次请求多次转发过程中的所有servlet共享
session session 一次会话
application servletContext 整个项目

★jsp的动作标签(都是项目内的路径)
<jsp:forward>(在jsp页面使用请求转发)
<jsp:forward page="..."> 相当于<%request.getRequestDispatcher(***).forward(***)%>
<jsp:include>(动态包含)
<jsp:include page="...">
将被包含的页面运行后的结果包含进来,将所用的jsp页面都编译了

路径总结:
整体项目路径:
重定向:response.sendRedirect("url");
刷 新:setHeader("refresh","3,url");
超链接:href="url";
验证码:src="url";
项目内路径:
请求转发:request.getRequestDispatcher("url").forward(request,response);
jsp中: errorPage="url"


el和jstl总结:

★获取数据:
1.简单数据
${pageScope|requestScope|sessionScope|applicationScope.属性名}
2.获取复杂数据
属性值为list和数组:
${pageScope|requestScope|sessionScope|applicationScope.属性名[index]}
属性值为map
${pageScope|requestScope|sessionScope|applicationScope.属性名.键名}
3.属性值为对象
${pageScope|requestScope|sessionScope|applicationScope.属性名.属性} 
注:当属性名中有"." "+" "-"等特殊符号是必须使用${xxxScope["属性名"]}来获取

★运算符
1.+ - * /
这些符号只能做运算处理,"+"没有连接的作用,其参数是整数或者是字符串类型的数字
2.empty
判断一个容器(/对象)的长度是否为零(/空):是 true ,否 false
3.支持三元运算符 > < == && || !

★web常用对象
1.四个(常用)内置对象
pageScope 作用: 从pageContext域中获取数据 (了解)
requestScope 作用: 从request域中获取数据
sessionScope 作用: 从session域中获取数据
applicationScope 作用: 从ServletContext域中获取数据
2.pageContext(常用作用:获取当前项目名路径: /day01)
${pageContext.request.contextPath}
cookie(在jsp中获取cookie)
${cookie.名称.value}

jstl: 离不开el
jsp标准的标签库语言 
jstl的分类:
core:核心 (if foreach)
fmt:国际化或者格式化(不学了)
sql:和sql相关的(不学了)
xml:和xml相关的(不学了)
函数库(不学了)
jstl的使用步骤:
1.导入jar包(两个jar包)
2.在页面上导入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
c:if使用
格式:
<c:if test="el表达式" [var="表达式的返回值"]>
条件成立的时候输出的内容
</c:if>
c:forEach使用
格式1:
<c:forEach begin="开始" end="结束" step="循环的间隔数" var="变量名(每次循环的值)" varStatus="记录循环状态">
${变量名 }
</c:forEach>
注意:
varStatus使用
常用属性:
count:记录当前是第几个
first:判断当前元素是否为第一个
last:判断当前元素是否为最后一个
例如:
<c:forEach begin="1" end="10" step="1" var="i">
${i }
</c:forEach>
格式2:高级
<c:forEach items="${el表达式}" var="变量名"> 
${变量名}
</c:forEach>
map的循环底层是键值映射关系

Filter过滤器

(本质上是一个类,这个类对浏览器访问服务器资源时的一种过滤)

使用方法:
<1.在web.xml下编写配置文件,如:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.itcast.filter</filer-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--要过滤的资源-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<2.编写过滤器类实现Filter接口,重写里面的doFilter方法
注:当服务器开启的时候,服务器创建filter对象,且调用init方法实现初始化;
当请求来的时候,若能匹配上url-pattern里面的服务器资源路径(该标签顺序从上到下,然后再
执行servlet-name标签中标定的具体的servlet),则服务器调用doFilter过滤请求,访问一次过滤一次;
filter-mapping标签下还有dispatcher标签来对过滤方式进行标注:REQUEST(默认从浏览器发过来的请求),FORWARD(转发的请求)
当服务器正常关闭,服务器调用destroy实现销毁操作
<3.url-pattern的写法 (和servlet一样)
完全匹配 以/开头 配置单一资源 /sd1 /sd2 /sd3
目录匹配 以/开头,以*结尾 配置多个资源 /*
扩展名匹配 不以/开头,以.结尾 *.jsp

Listener监听器

(本质上是一个类,这个类只负责监听其他Javabean的状态变化(3个域对象))

作用:
负责监听其他Javabean的状态变化(ServletContext,ServletRequest,HttpSession)
包括:3个域对象的创建和销毁;
3个域对象XXXAttribute的属性变化
Javabean在session中的状态变化(活化,钝化...)
java提供的常见监听器: 
监听三个对象的创建和销毁:
ServletContextListener(重点)
ServletRequestListener
HttpSessionListener

监听三个对象属性的变化: 
ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener
监听javabean在session中的状态:(不需要在web.xml中配置)
HttpSessionBindingListener(监听javabean是绑定到了session中还是从session中移除了)
HttpSessionActivationListener(监听javabean活化还是钝化---服务器正常关闭)
钝化:session带着javabean序列化到磁盘上
活化:session带着javabean从磁盘上又回到了服务器内存中
注:一般编写的Javabean需要实现序列化接口,防止在钝化过程中发生错误

使用(编写一个ServletContext对象监听器):
1.创建一个类,实现接口ServletContextListener
2.在web.xml最上面(welcome后面)编写配置文件信息
<listener>
<listener-class>监听器的全限定名<listener-class>
</listener>
作用:在服务器启动的时候加载框架的一些配置信息

原文地址:https://www.cnblogs.com/zbdouble/p/8414377.html