1、Servlet3.X 基于Annoation的编程
2、关于serlvet的url-path的/、/*、/xxxx的区别
/xxxx只能匹配/xxxx
/与/*可以匹配任意,但区别在于/可以拿到ServletPath、而/*拿不到*的匹配内容
--------------------------tomcat配置---------------------------------
在server.xml的<Connetor URIEncoding=“UTF-8”>可解决GET方式的乱码
1、映射虚拟目录
1、 在tomcat的confg下的server.xml的host标签中加上<Context
path='虚拟目录' docBase="本地目录 />【此方法要重启服务器】[如果path=''就为缺省的web应用]
2、在conf/Catalina下添加相应的xml文件,文件名为虚拟目录【如果文件名为ROOT.xml则为缺省的】,
其中还是写一样的context代码
3、直接写在tomcat下的webapps下,服务器会自动把webapps下的所有目录映射
2、在本地配置一个自定义域名如[www.mokai .com]
1、配置hosts文件 打开系统盘下的Windows\System32\drivers\etc下的hosts文件,往里面加你的域名 如 127.0.0.1 www.mokai.com 【前面的ip为本地,也可以自定义其他ip】
2、建好相应的web应用目录3、在tomcat的conf下的srver.xml里面加上<Host name="域名 " appBase="主机目录" unpackWARs="true" autoDeploy="true"><Context path="" docBase="web应用目录"/></Host>
3、通常开发好一个程序会把应用目录打包成一个.war的包,上传服务器
4、在context标签里面加上reloadable="true"时,应用被修改时会自动加载
--------------------------------------------------------------------------HTTP协议-----------------------------------------------------------------------
1、常用请求头:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp 从哪访问的
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
2、常用响应头:
Location: http://www.it315.org/index.jsp
Server:apache tomcat
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
Refresh: 1;url=http://www.it315.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
1、下载 res.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
2、编码 res.setHeader("Content-type", "text/html;charset=UTF-8");
3、自动刷新 res.setHeader("refresh", "3");
res.setHeader("refresh", "3;url='/Demo3'"); //url为跳转的地址
4、 消除缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
5、文件上传:enctype="multipart/form-data" method="POST"
6、https协议使用端口是443,加密方式是SSL
7、json的header为 application/Json;charset=utf-8
------------------------------------------------servlet----------------------------------------------------------
1、Servlet是服务器小应用程序【引擎】,由Web服务器来调用的一个java类,用来完成B/S架构下,客户端请求的响应处理
在Servlet中的相对路径都是相对相对当前应用的根目录来的
Servlet内部采用的是iso8859-1编码
javaweb的mvc m[model
javabean] v[view jsp]
c[cotroller servlet]
2、开发Servlet类一般继承HttpServlet类,另外Servlet中不适合输出
3、映射到URL中时可以使用 * 通配符,但只能有两种固定格式,
一种格式是 *.扩展名 如: *.html
另一种是 /* 如:/aa
如果只为 / 则为缺省的Servlet
4、Servlet默认情况下,在客户端第一次请求时加载【加载init方法】,在servlet重新加载时【如重新部署】关闭【加载destroy方法】,
在此期间,客户端的每次请求都导致service方法被调用,对于每访问请求,Servlet引擎都会创建
一个新的ServletRequest 请求对象与ServletResponse回应对象,然后将这个两个对象作为参数传给他调用的service()方法,
server方法再根据请求方式分别调用doXXX方法
5、如果在web.xml的servlet标签里面加入<load-on-startup>3</load-on-startup>【3为优先时间】Servlet对象则会在web服务器启动时就加载,可以避免应用发布后客户端第一次访问时会很久时间
6、Servletconfig 可以使用在web.xml中的servlet标签中加入<init-parm>标签为程序提供配置信息
7、ServletContext【context域对象】【还有其他三个域:request session page】
用途:1、做为整个WEB应用的参数 <Context-parm></Context-parm>
2、多个Servelet对象共享数据
3、实现Servlet的转发
4、读取应用中的资源文件
8、response对象[响应信息]
1、输出时编码问题:
第一种: res.setCharacterEncoding("utf-8"); //设置response使用的编码
res.setHeader("Content-type", "text/html;charset=UTF-8"); //设置浏览器编码
或用封装好的方法
res.setContentType("text/html;charset=UTF-8");
第二种:
输出流.write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes());
2、常见应用:验证码 自己新建一张BufferedImage然后写各种干扰和数字,用ImageIo写到IE中去
跳转url <meta http-equiv='refresh' content='3;url=/index.jsp' > 用meta标签模拟http头
3、请求重定向 浏览器会服务器发送两次,意味着就有2个request/response对象
用重定向技术,浏览器地址会发生变化
res.setStatus(302);
res.setHeader("location", "/");
or
res.sendRedirect("/");
4、转发 this.getServletContext().getRequestDispatcher("/Demo4").forward(req,res); 相当于调用另外一个Servlet,但浏览器地址不会变
细节:getOutputStream() getWriter()方法分别用于输出二进制文件与文本文件,并且二种方式互相排斥
getOutputStream的流不需要自己关闭,Servlet容器在取response信息时会自动关闭
且ServletOutputStream.println( )只支持ISO-8859-1
9、request对象[请求信息]
1、常用方法
getParameter(name) 获得指定的get参数
2、乱码问题:get方式【手动查码表】【通用】 new String(name.getBytes("iso8859-1"),"UTF-8");
post方式 request.setCharacterEncoding("utf-8");
3、请求转发的特点:
客户端只发一次请求,而服务器端有多个资源调用
客户端浏览地址栏没有变化
细节:在进行request转发[forward方法被调用]之前,不可向浏览器输出数据【可向respones里写,但流不可关】,也不可在之后再轩发【转发之后要return】
forward会清空respones中的数据
10、web中各类地址的写法
1、如果是服务器操作则针对当前应用
2、如果是浏览器操作则针对当前服务器
12、Cookie对象【存在于客户端浏览器】【如果想在其他页面也获得该cookie,必须设置setPath("")】
1、cookie默认的生命周期与浏览器进程生命周期并行,如果希望自定义保存浏览器保存时间,可用setMaxAge()方法
2、浏览器一般只允许存放300个cookie,每个站点最多放20个cookie,每个cookie的大小限制为4kb
3、如果想删除指定cookie,则要:
cookie.setPath("/");//此cookie只针对当前页面有效
cookie.setMaxAge(0);
response.addCookie(cookie);//然后在回写给浏览器
13、session对象【存在于服务器中】【session对象是基于cookie的】
1、一个session对象默认只为一个会话服务【除非设置了JSESSION的setMaxAge()】
2、session工作原理:当客户端第一次在Servlet里调用getSession时,会创建一个Session对象,并会回写一个JRESSIONID的cookie,
当客户端下次[同一次会话中]访问时JRESSIONID的cookie带过来,当在调用getSession时,Servlet引擎会判断
3、解决seesion只为一个会话服务:可通过设置cookie为JRESSIONID的缓存时间
HttpSession hs=req.getSession();//Session此时创建
//自定义session的cookie ID缓存时间
String id=hs.getId();
Cookie c=new Cookie("JSESSIONID",id);
c.setMaxAge(30*60);
c.setPath("/");
res.addCookie(c);
4、解决客户端浏览器Cookie禁用:可通过重写url相应的地址【url后面加上JRESSIONID的参数】来实现会话期间的数据保存
如下代码:
req.getSession();
String url1=res.encodeURL("/SessionDemo1");//如果浏览器的cookie被禁用,这方法会自动识别,自动创建cookie
id
String url2=res.encodeURL("/SessionDemo2");
Out.println(res, "<a href='"+url1+"'>购买</a> ");
Out.println(res, "<a href='"+url2+"'>结账</a>");
------------------------------------------------jsp----------------------------------------------------------
1、jsp脚本片断语法 <% %>
良好的jsp页面里不能出现一行script代码
脚本表达式 <%=expression%>
jsp脚本用客户端注释<!-- --> 不能注掉
2、多个脚本片断之间可以相互访问
3、Jsp声明,<%! public void run(){ }%>
4、jsp注释 <%---%>
5、jsp指令 <%@ %>
Page
session="true"|"false" jsp创建时是否创建session
errorPage="/err/err.jsp" jsp出错后自动转出错页面
iserrorPage="true | false" 页面是否为出错页面,如果是则会创建一个exception对象
include【编译时包含】【常用】
包含的所有JSP翻译成一个servlet 不要出现重复的HTML全局架构标签
response的include【运行时包含】【效率低】
包含的多个JSP翻译成个多个相应的servlet
6、jsp引擎自动导入了如下包
java.lang.*;
javax.servlet.*;
javax.servlet.jsp.*;
javaxservlet.http.*;
7、如果想自定义错误页面可以在web.xml里面使用error-Page来配置
8、九大隐式对象:
1、 response
2、exception
6、 appliction 【整个应用程序】【最大的域】【ServletContext】
5、out3、 config4、 page
6、 appliction 【整个应用程序】【最大的域】【ServletContext】
7、 session【整个会话期间】
8、 request 【整个请求】
9、 pageContext【整个页面】【包含其他隐式对象】【用在自定义标签开发技术里】【最小的域】
findAttribute(name) 整个域查找【查找顺序:page session request apption】【e1表达式也是利用这个方法来查找的】
9、jsp标签
10、模板数据就是jsp的静态html与xml内容
11、动作脚本:
1、jsp:useBean
<jsp:useBean id="user" class="bean.User" scope="session">
标签体执行<!-- 标签体只在user创建时才会执行 -->
</jsp:useBean>
为bean属性赋值 <jsp:setProperty name="user" property="uname" value="龚凯" />
如果想用请求参数为bean属性赋值,则param='属性名'
【param与value不能同时存在】【如果想用所有请求参数赋值只要 property ='*'】【请求参数为bean属性赋值只能为基本类型】
12、EL表达式【转换成Servlet后,实际调用的pageContext.findAttribute()方法,如果为null,则返回"" 】
隐式对象:
pageContextpageScoperequestScopesessionScopeapplicationScopeparam【获得参数】
paramValues
HeaderheaderValuesCookieinitParam
运算符:
EL算术运算符 + - * /(div) %(mod)EL关系运算符 ==(eq) !=(ne) <(lt) >(gt) <=(le) >=(ge)逻辑运算符 &&(and) ||(or) !(not)empty运算符 empty条件运算符3元运算符
1、访问一个javaBean的属性可通过 .[点]来获得,引用变量类型的属性可以一直点下去,
访问一个javaBean的属性实际是通过getXXX()方法来获得的
2、取数据时如果用点取不出来就用[]来取
3、获得当前WEB应用的路径 ${pageContext.request.contextPath}
4、操作参数:获取单个可通过param.参数名来获得参数值,如果为多个值时【如checkBox】,则用这个paramValues.参数名[n]
5、操作集合:如果为List集合则可以通过序号的方式来获取第几个 如:${list[0]}
如果为Map集合则要el与JSTL一起用来达到遍历的效果 如:${map.a} 或${map['a']}
6、${pageContext.request.contextPath} 可获得WEB应用名称
13、JSTL标签
14、Filter【过虑器】【单例的】
工作原理:![]()
1、Filter链:多个Filter程序对一个Servlet程序拦截
2、在doFilter方法中的调用FilterChain.doFilter()方法之前的代码 为前置代码,既 service 调用之前执行代码,FilterChain.doFilter()方法之后的代码,为后置代码,service之后执行的代码
15、自定义标签
工作原理:
1、传统标签【过时】【TagSupport类】【标签池缓存】
2、简单标签 【SimpleTagSupport 类 】【不能包含JSP代码】
得到body体内容用this.getJspBody,会得到一个JspFragment对象,然后通过对象.invoke()方法写进流里面【可以是getJspContext.getOut()
或自定义的流】
3、开发带有属性的标签:1、标签处理类里有相应属性的setXXX()方法
2、tld标签描述文件中映射好标签
<attribute>
<name>count</name> 属性名字<required>true</required> 是否为可选属性
<rtexprvalue>true</rtexprvalue> 是否允许EL表达式
</attribute>
3、属性的类型可以是引用类型
4、如果使用include引入页面中使用自定义标签,那么返回值不仅会影响引入页面后后面的代码,而且会影响引用页的代码
但<jsp:include>不会影响引用页后面的代码
5、如果想停止标签后面的代码执行,就throw new SkipPageException();
6、在自定义标签里定义变量在tld文件里添加<variable></variable>
16、自定义函数
1、方法必须是static 的