JavaWeb
HTTP协议
HTTP常见状态码
1
2
3
4
5
6
7
8200 OK //客户端请求成功 400 Bad Request //客户端请求语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态码必须和www-Authentication报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝服务 404 Not Found //请求资源不存在,输入url错误 500 Internal Service Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Tomcat
tomca真正访问的是项目目录下out里面部署的文本项目,目录下的资源对应的是项目目录的资源
1
2
3
4
5
6
7#解决tomcat,startup.bat运行闪退方法右键startup.bat进入编辑在最顶端加上2个路径 SET JAVA_HOME=() #java目录 SET CATALINA_HOME=() #tomcat目录 #控制台可以CATALINA_BASE文件夹里面就是当前项目部署的tomcat配置 Using CATALINA_BASE: "C:UsersLZJ.IntelliJIdea2018.3systemtomcat"
servlet项目练习
calss文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25@WebServlet("/abc")//servlet 注解开发可以省略了web.xml里面的设置访问路径 public class SerlerDemo1 implements Servlet { //impServlet接口从写方法 @Override public void init(ServletConfig servletConfig) throws ServletException { //程序初始化时执行会执行一次 //因为servlet是单例模式,多用户访问会存在线程安全问题 解决方法:定义局部变量不要定义成员变量 } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //每次访问servlet的时候,服务器方法都会被调用 } @Override public String getServletInfo() { return null; } @Override public void destroy() { //在servlet销毁之前执行一次,一般用于释放资源 } }
web.xml文件
1
2
3
4
5
6
7
8
9
10
11
12<!--配置servlet--> <servlet> <servlet-name>demo1</servlet-name> <!--放入入全类名--> <servlet-class>com.lzj.servlet.SerlerDemo1</servlet-class> </servlet> <!--配置通过什么路径访问--> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>
request
用于获取响应消息数据
request基本方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21GET /day14/demo1?name=zhangsan HTTP/1.1 //GET方法 String getMethod() //获取请求方式GET String getContexPath() //获取虚拟目录 /day14 String getServeletPath() //获取servlet路径/demo1 String getQueryString() //获取get的请求参数 name=zhangshan String getRequestURL() //获取url day14/demo1 StringBuffer getRequestURL() //获取完整url :http://locahost/day14/demo1 String getProtocol()//获取http版本 String getRemoteadder()//获取客户机的ip地址 //post请求 BufferedReader getReader() //获取字符输入流,只能操作字符数据 servletInputSteam getInputStream()//获取字节输入流,可以操作所有类型 //通用方法 String getParameter(String name)//根据参数名称获取参数值 String[] getParameterValues(String name)//根据参数名称获取参数值的数组 getParameterNames()//获取所有请求参数名称 getParameterMap()//获取所有参数的map集合 //解决中文乱码问题 req.setCharacterEncoding("utf-8");
获取请求头和值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28//演示获取请求头名称 //1获取请求头名称 Enumeration<String> headerNames = req.getHeaderNames(); //2遍历 while (headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //根据名称获取请求头值 String value = req.getHeader(name); System.out.println(name+"---"+value); } //通过请求头获取user-agent判断对方用的是什么浏览器 String agent = req.getHeader("user-agent"); //判断agent的浏览器版本 if(agent.contains("Chrome")){ //谷歌浏览器 }else if (agent.contains("Firofox")){ //火狐浏览器 } //获取请求头数据referer演示放盗连接 String referer = req.getHeader("referer"); if(referer !=null ){ if(referer.contains(("/day14"))){ //正常访问 }else { //盗连接 } }
获取请求体
1
2
3
4
5
6
7
8
9//获取请求消息体--请求参数 //获取字符流 BufferedReader br = req.getReader(); //读取数据 String line = null; while ((line = br.readLine()) !=null){ System.out.println(line); }
request 转发
1
2
3
4
5
6
7//转发只能访问当前服务器内部的资源中 转发也是一次请求 //特点:地址栏路径不变 只能访问当地资源 转发是一次请求 可以使用request共享数据 RequestDispatcher requestDispatcher = req.getRequestDispatcher("/目标serlervlet路径"); requestDispatcher.forward(req,resp); //推荐写法 req.getRequestDispatcher("/目标路径").forward(req,resp);
数据的共享
1
2
3
4
5//request域:代表一次请求的范围,一般用于请求转发多个资源中的共 void SetAttribute(String name,Object obj) //存入数据 Object getAttribute(String name) //通过键获取值 removeAttribute(String name) //通过键不对应的值移除
Response
用来设置消息
重定向
1
2
3
4
5
6
7
8
9
10
11//特点:地址栏发生改变 重定向可以访问其他站点 重定向是两次请求 不能使用request共享数据 //访问/当前路径,会跳转到/目标路径 //设置状态码 resp.setStatus(302); //设置响应头 resp.setHeader("服务器ip","对应的url"); //动态获取虚拟目录 String contextPath = req.getContextPath(); //简单的重定向方法 resp.sendRedirect(contextPath+"url");
字符输出
1
2
3
4
5
6
7
8
9
10
11
12
13//获取对象流之前,设置流的编码 resp.setCharacterEncoding("utf-8"); //告诉浏览器,服务器发送的消息是已utf-8发送的建议他采用utf-8接收 resp.setHeader("content-type","text/html"); //简单方法设置编码格式 resp.setContentType("text/html;charset=utf-8"); //获取字符输出流 PrintWriter pw = resp.getWriter(); //输出数据 //可以输出html标签 pw.write("<h1>hello</h1>"); pw.write("afewfwa");
字节输出
1
2
3
4
5
6
7//简单方法设置编码格式 resp.setContentType("text/html;charset=utf-8"); //获取字节输出流 ServletOutputStream outputStream = resp.getOutputStream(); //输出数据 outputStream.write("afda".getBytes("utf-8"));
ServletContext
ServletContext获取方法
1
2
3
4
5
6
7
8//ServletContext对象的获取 // 1.通过request对象获取 ServletContext context1 = req.getServletContext(); // 2.通过HttpServlet获取 ServletContext context2 = this.getServletContext();
ServletContext功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22//ServletContext获取MIME类型 //通过HttpServlet获取 ServletContext context = this.getServletContext(); //定义文件名称 String filename = "a.jpg"; //获取MIME类型 String mimeType = context.getMimeType(filename); System.out.println(mimeType); //范围最大的共享所有数据 (使用需很谨慎!!!) //通过HttpServlet获取 ServletContext context = this.getServletContext(); //获取数据 Object msg = context.setAttribute("msg"); //获取文件真实路径 (把绝对路径变成真实路径) //通过HttpServlet获取 ServletContext context = this.getServletContext(); //获取文件的服务器路径 String realPath = context.getRealPath("/b.txt"); //获取项目目录下b文件的完整路径 String webinfF = context.getRealPath("/WEB-INF/b.txt"); //获取web-inf下b文件的完整路径 String src = context.getRealPath("/WEB-INF/classes/b.txt"); //获取src下b文件的完整路径 File file = new File(realPath);
会话技术
Cookie特点
- cookie存储数据在客户端浏览器
- 单个浏览器cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20kb)
作用
- cookie一般存储少量不敏感的数据
- 在不登陆的情况下完成一个服务器对客户端的身份识别
Cookie使用
1
2
3
4
5
6
7
8
9
10
11
12//创建Cookie对象 Cookie c1 = new Cookie("msg","hello"); c1.setMaxAge(30); //设置Cookie C1的存活时间>0表示在多少秒后删除 =0直接删除 <0在浏览器关闭后删除 Cookie c2 = new Cookie("name","lzj"); //Cookie可以传递多个 c2.setPath("/"); //c2的Cookie在当前服务器下当前项目下共享 如果2给项目同时setPath("/")同服务器下2个项目可以共享Cookie //setDomain(String path):如果设置一级域名相同,那么多个服务器之间的Cookie可以共享 //setDomain(".baidu.com")那么tiba.baidu.com和news.baidu.com可以共享 //发送Cookie resp.addCookie(c1); resp.addCookie(c2);
1
2
3
4
5
6
7
8
9
10
11//获取Cookie Cookie[] cs = req.getCookies(); //获取数据,遍历Cookies if(cs != null){ for (Cookie c : cs) { String name = c.getName(); String value = c.getValue(); System.out.println(name+":"+value); } }
Seccion特点
Seecion用于存储一次会话的多次请求数据,可以存储容易类型,任意大小的数据
Seecion于Cookice区别
- seecion存储于客户端cookie存储于服务端
- session没有数据大小限制Cookie有
- session数据安全,cookie相对不安全
Seecion原理:Session实现是依赖于Cookie的
HttpSeecion对象:
- 获取HttpSeecion对象
- HttpSeecion session = request.getSession();
- 使用HttpSeecion对象
- Object getAttribute(String name)
- void setAttribute(String name,Object value)
- void removeAttributer(String name)
Session使用
1
2
3
4
5
6//使用session共享数据 //获取session HttpSession session = req.getSession(); //存储数据 session.setAttribute("msg","hello session");
1
2
3
4
5
6
7
8
9
10//使用session共享数据 //获取session HttpSession session = req.getSession(); //获取数据 session.getAttribute("msg"); //期望客户端关闭后,session也能存在 Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); resp.addCookie(c);
JSP
java服务器端页面 可以直接定义html标签又可以使用<%%>定义java代码
JSP指令:用于配置JSP页面,导入资源文件
- <%@ page 属性名称1=属性值1 属性名称2=属性值2 …%> 配置JSP页面
- contentType:设置编码格式
- import:导包
- errorPage:当前页面发送异常后,会自动跳转到指定页面
- isErrorPage:标注当前页面为错误对象就可以使用exception内置对象
- <%@ include 属性名称1=属性值1 属性名称2=属性值2 …%> 页面包含的,导入页面的资源文件
- file:引用jsp页面
- <%@ taglib 属性名称1=属性值1 属性名称2=属性值2 …%> 导入资源
- prefix:为引用库定义一个前缀
- uri:引用库的url
JSP的脚步:JSP定义java代码的方式
- <% 代码 %>:定义的java代码,在service方法中,service方法中可以定义什么,JSP就可以定义什么。
- <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
- <%= 代码%>:定义的java代码,会输出到页面上。输出语句定义什么就输出什么
JSP的内置对象:在JSP中不需要获取和创建就可以直接用的对象
变量名 真实类型 作用
- pageContext PageContext 当前页面共享数据 ,还可以使用get获取其它内置对象
- requset HttpServletRequest 一次请求访问的多个资源(转发)
- session HttpSession 一次会话的多个请求间
- application ServletContext 所有用户共享数据
- response HttpServletResponse 响应对象
- page Object 当前页面(servlet)的对象this
- out JspWriter 输出对象,数据输出到页面上
- config ServletConfig Servlet的配置对象
- exception Throwable 异常对象
EL表达式
EL作用与语法
替换和简化jsp页面中的java代码的编写语法:${表达式}
EL的使用
-
运算:
-
算数: + - * /(div) %(mod)
-
比较: > < >= <= == !=
-
逻辑: &&(and) ||(or) !(not)
-
空运算:empty 用法
${empty list}:判断字符串、集合等为null且长度为0
${not empty list}:判断字符串、集合等不为null且长度>0
-
-
语法:
-
${域名称.键名}:从指定域中获取指定键的值
-
域名称
-
PageScope --> PageContext
-
requestScope --> request
-
sessionScope --> session
-
applicationScope --> applicaton(servletContext)
举例在request存了name=张三 获取:${requestScope.name}
-
-
${键名}:依次从最小的域中查找是否有该键对应的值,直到找到为止
-
获取对象、list、Map
- 对象:${域名称.键名.属性名}
- List集合: ${域名称.键名[索引]}
- Map集合: 域 名 称 . 键 名 . k e y 名 称 或 者 {域名称.键名.key名称}或者 域名称.键名.key名称或者{域名称.键名[“key名称”]}
-
-
-
隐式对象:
- el表达式中的11个隐式对象
- pageContext
- 获取jsp其它八个内置对象
- ${pageContext.request.contextPath} 动态获取虚拟目录
- 获取jsp其它八个内置对象
- pageContext
- el表达式中的11个隐式对象
JSTL标签
JSTL作用
用于简化和替换jsp页面上的java代码
常用标签
- if :相当于java代码的if语句
- choose :相当于java代码的switch语句
- foreach :相当于java代码的for语句
if标签的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<%--c:if标签 --%> <%--test是必须属性接收Boolean表达式 如果为true则显示if标签体内容,如果是false,则不显示标签内容--%> <%--一般情况下,test属性值会结合el表达式一起使用--%> <%--c:if标签是没有else c::if标签有else--%> <c:if test="true"> <h1>我是真的</h1> </c:if> <% //判断request域中的一个list集合是否为空,如果不为null则显示遍历集合 List list = new ArrayList(); list.add("aaaa"); request.setAttribute("list",list); %> <c:if test="${not empty list}"> 遍历集合 </c:if>
choose标签使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<%--完成数字编号对应星期几的案例--%> <%--1.域中存储一组数字--%> <%--2.使用choose标签取出数字 相对于switch声明--%> <%--3.使用when标签做数字判断 相对于case--%> <%--4.otherwise标签做其它情况的声明 相对于default--%> <% request.setAttribute("number",3); %> <c:choose> <c:when test="${number ==1}">星期一</c:when> <c:when test="${number ==2}">星期二</c:when> <c:when test="${number ==3}">星期三</c:when> <c:when test="${number ==4}">星期四</c:when> <c:when test="${number ==4}">星期五</c:when> <c:when test="${number ==6}">星期六</c:when> <c:when test="${number ==7}">星期天</c:when> <c:otherwise>数字输入有误</c:otherwise> </c:choose>
foreach标签使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31<%--foreach:相对于java代码的for语句--%> <%--1.完成重复操作--%> <%--for(int i=0;i<10;i++){}--%> <%--对应属性:begin:开始值--%> <%--end:结束值--%> <%--var: 临时值--%> <%--step:步长 每次运算移动多少步--%> <%--varStatus:循环状态对象 index:容器中元素索引 count:循环次数--%> <%--2.遍历容器--%> <%--List<User> list;--%> <%--for(User user:list){}--%> <%--对应属性:items:容器对象--%> <%--varStatus:循环状态对象 index:容器中元素索引 count:循环次数--%> <c:forEach begin="1" end="10" var="i" step="1" varStatus="s"> ${i}<br> </c:forEach> <% List list1 = new ArrayList(); list1.add("aaa"); list1.add("bbb"); list1.add("ccc"); list1.add("ddd"); list1.add("eee"); request.setAttribute("list1",list1); %> <c:forEach items="${list1}" var="str" varStatus="s"> ${s.index} ${s.count} ${str} </c:forEach>
Filetr过滤器
Class配置过滤器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@WebFilter("/*") //直接在类上WebFilter注解 加入访问所有资源之前都会执行该过滤器 如果需要设置访问特定"/访问路径" public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //对Request对象请求消息增强 System.out.println("filterDemo1被执行了!"); //放行 filterChain.doFilter(servletRequest,servletResponse); //回来时是不用重新执行方法的而是直接接着执行放行后面的代码 System.out.println("filterDemo1回来了!"); } @Override public void destroy() { } }
Web.xml配置过滤器
1
2
3
4
5
6
7
8
9
10
11
12<!--引用FilterDemo1class的过滤设置--> <filter> <filter-name>demo1</filter-name> <filter-class>com.lzj.filter.FilterDemo1</filter-class> </filter> <!--拦截路径为/*全部路径--> <filter-mapping> <filter-name>demo1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
拦截方式配置
- REQUEST:默认值浏览器直接请求资源
- FORWARD:转发访问
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
1
2
3
4
5
6
7//只有浏览器直接请求index.jsp资源时,该过滤器会被执行 //@WebFilter(value = "index.jsp",dispatcherTypes = DispatcherType.ERROR) //只有浏览器转发访问index.jsp资源时,该过滤器会被执行 //@WebFilter(value = "index.jsp",dispatcherTypes = DispatcherType.FORWARD) //只有浏览器直接请求index.jsp或者转发index.jsp过滤器就会执行 //@WebFilter(value = "index.jsp",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
ServletContextListener监听器
多用于加载配置文件
监听器的创建于使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public class ContextLoaderListener implements ServletContextListener { //监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建 //服务器启动后自动调用/ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { //加载资源文件 //获取servleContext对象 ServletContext servletContext =servletContextEvent.getServletContext(); //加载资源文件 String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation"); //获取真实路径 String realPath = servletContext.getRealPath(contextConfigLocation); //加载进内存 try { FileInputStream fis = new FileInputStream(realPath); System.out.println(fis); }catch (Exception e){ e.printStackTrace(); } System.out.println("ServletContext对象被创建了"); } //在服务器关闭后,ServletContext对象销毁。当服务器正常关闭后该方法被调用 @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
1
2
3
4
5
6
7
8
9
10<!--配置监听器--> <listener> <listener-class>com.lzj.listenner.ContextLoaderListener</listener-class> </listener> <!--指定初始化参数信息--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/applicationContext.xml</param-value> </context-param>
Jquery
基本运用
- jquery对象操作时,更加方便
- jquery对象和js对象方法不通用
- 两者相互转换
- jq --> js:jq对象[索引] 或者 jq对象.get(索引)
- js --> jq : $(js对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//获取对象 var div1 = $("#div1"); alert(div1.html()); //通过jq方式获取名叫div的所有html元素对象 var $divs = $("div"); alert($divs); //可以当作对象和数组使用 //对所有的dvi,让内容变成bbb,使用jq方式 $divs.html("bbb") //监听按钮 $("#b1").click(function () { //点击事件后 }) //jquery入口函数(dome文档加载完成只后执行该函数中的代码) $(sunction()){ //监听的代码 })
选择器
基本选择器
- 标签选择器(元素选择器)
- 语法:$(“html标签名称”)获取所有匹配标签名称的元素
- id选择器
- 语法:$("#id的属性值")获得于指定id属性值匹配的元素
- 类选择器
- 语法:$(".class")获得与指定的class属性值匹配的元素
- 并集选择器
- 语法:$(“选择器1,选择器2…”)获得多个选择器中的所有元素
层级选择器
- 后代选择器
- 语法:$(“A B”)选择A元素内部所有的B元素
- 子选择器
- 语法:$(“A>B”)选择A元素内部的所有B子元素
属性选择器
- 属性名称选择器
- 语法:$(“A[属性名]”)包含指定元素的选择器
- 属性选择器
- 语法:$(“A[属性名=‘值’]”)包含指定属性等于指定值的选择器
- 复合选择器
- 语法:$(“A[属性名=‘值’] [ ]…”)包含多个属性条件选择器
过滤选择器
- 首元素选择器
- 语法::first 获得选择的元素中的第一元素
- 尾元素选择器
- 语法::last 获得选择的元素的最后一个元素
- 非元素选择器
- 语法::not(selecter)不包含指定内的元素
- 偶数选择器
- 语法::even 偶数,从0开始计数
- 奇数选择器
- 语法::odd 奇数,从0开始计数
- 等于索引选择器
- 语法::eq(index)指定索引元素
- 大于索引选择器
- 语法::gt(index)大于指定索引元素
- 小于索引选择器
- 语法::lt(index)小于指定索引元素
- 标题选择器
- 语法::header获得标题元素,固定写法
表单过滤选择器
- 可用元素选择器
- 语法::enabled获得可用元素
- 不可用元素选择器
- 语法::disabled获得不可用元素
- 选中选择器
- 语法::checked获得单选/复选框选择器中的元素
- 选中选择器
- 语法::selected获得下拉框选中的元素
DOM操作
-
内容操作
- html():获取/设置元素标签体内容
- text():获取/设置元素的标签纯文本内容
- val():获取/设置元素的value属性值
-
属性操作
-
通用属性操作
-
attr():获取/设置元素的属性
-
removeAttr():删除属性
-
prop():获取/设置元素的属性
-
removeProp():删除属性
attr和porp区别?
如果操作的是元素的固有属性(html只带的属性),则建议使用prop
如果操作的是元素的自定义属性,则建议使用attr
-
-
对class属性操作
-
addClass():添加class属性
-
remoncClass():删除class属性
-
toggleClass():切换class属性
如果toggleClass(“one”):
判断如果元素对象上存在class=“one”,则将属性值one删除掉。如果原始对象上不存在class=“one”,则添加
-
-
-
CRUD操作
-
append():父元素将子元素追加到末尾
对象1.append(对象2):将对象2添加到对象1元素内部,并且在末尾
-
prepend():父元素将子元素追加到开头
对象1.prepend(对象2):将对象2添加到对象1元素内部,并且开头
-
appendTo()
对象1.appendTo(对象2):将对象1添加到对象2内部,并且在末尾
-
prependTo()
对象1.prependTo(对象2):将对象1添加到对象2内部,并且开头
-
after()
对象1.after(对象2):将对象2添加到对应后边,对象1和对象2是兄弟关系
-
before()
对象1.before(对象2):将对象2添加到对象1前面。对象1和对象2是兄弟关系
-
insertAfter()
对象1.insertAfter(对象2):将对象2添加到对象1后边。对象1和对象2是兄弟关系
-
inertBefore()
对象1.isertBefore(对象2):将对象2添加到对象1前面。对象1和对象2是兄弟关系
-
remove()
对象.remove():将对象删除掉
-
empty()
对象.empty():将对象的后代元素区别清空,但是保留当前对象其属性点
-
jquery动画
- 三种方式显示和隐藏元素
- 默认显示和隐藏方式
- show([speed,[easing],[fn]])
- 参数
- speed:动画的署到三个定义的值(“slow”,“normal”,“fast”)或表示动画时长的毫秒数值(如:1000)
- easing:用来指定切换效果,默认是"swing",可用参数"linear"
- swing:动画执行时效果是 先慢 中快 后慢
- linear:动画执行时速度是匀速
- fn:在动画完成时执行的函数,每个元素执行一次
- 参数
- hide([speed,[easing],[fn]])
- toggle([speed,[easing],[fn]])
- show([speed,[easing],[fn]])
- 滑动显示和隐藏方式
- slideDown([speed,[easing],[fn]])
- slideUp([speed,[easing],[fn]])
- slideToggle([speed,[easing],[fn]])
- 淡入淡出显示和隐藏方式
- fadenIn([speed,[easing],[fn]])
- fadeOut([speed,[easing],[fn]])
- fadeToggle([speed,[easing],[fn]])
- 默认显示和隐藏方式
juqery遍历
-
jq对象.each(callback)
jquery对象.each(function(index,element){})
index:就是元素中的集合的索引
element:就是元素中的每一个元素对象
this:集合中的每一个元素对象
回调函数的返回值
ture:如果当前function返回为false,则结束循环
false:如果当前function返回为true,则结束本次循环,继续下次循环(continue)
-
$.each(object,[callback])
-
for…of
for(元素对象 of 容器对象)
jquery事件绑定
-
jq对象.事件方法(回调函数)
jq对象.事件方法(回调函数)
-
on绑定事件/off解除事件
jq对象.on(“事件名称”,回调函数)
jq对象.off(“事件名称”,回调函数)
-
事件切换:toggle
jq对象.toggle(fn1,fn2…)点击第二次就会运行fn2
ajax
-
$.ajax()
语法:$.ajax({键值对})
复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$.ajax({ url:"",//请求路径 type:"POST",//请求方式 data:{"username":"jack","age":23},//请求数据 success:function (data) { alert(data) //请求成功后的回调函数 }, error:function () { alert("出错啦") //表示如果请求响应出现错误,会执行的回调函数 }, dataType:"text" //设置接受到的响应数据的格式 })
-
$.get
语法:$.get(url,[data],[callback],[type])
参数:url:请求路径,data:请求参数,callback:回调函数,type:响应结果的类型
复制代码1
2
3$.get("http://www.baidu.com",{username:"jack",age:23},function (data) { }),"JSON";
-
$.post
复制代码1
2
3$.post("http://www.baidu.com",{username:"jack",age:23},function (data) { }),"JSON";
记录上一次登陆日期案例
访问一个servlet,如果是第一次访问就会显示:你好,欢迎您首次访问;如果不是第一次访问会打印欢迎回来上一次访问时间为:YYYY-mm-dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43//设置响应消息体的数据格式以及编码 resp.setContentType("text/html;charset=utf-8"); //获取所有Cookie Cookie[] cookies = req.getCookies(); boolean flag = false;//没有cookie为lastTime //判断有数据,获取数据,遍历Cookies if(cookies != null && cookies.length >0){ for (Cookie cookie : cookies) { //获取所有Cookies名称 String name = cookie.getName(); if ("lastTime".equals(name)){ //怎么有该cookie不是第一次访问 flag = true; //如果有这个cookie就把flag设置成为true //设置Cookie的value 获取当前时间的字符串,重新设置Cookie的值 Date date = new Date(); //获取一个当前时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //格式时间 String str_date = sdf.format(date); //解析 str_date = URLEncoder.encode(str_date,"utf-8");//URL编码 cookie.setValue(str_date);//存入cookie cookie.setMaxAge(60*60*24*30);//设置cookie的存活时间是一个月 resp.addCookie(cookie); //把值写入cookie //响应数据 //获取cookie的value String value = cookie.getValue(); value = URLDecoder.decode(value, "utf-8"); //URL解码 resp.getWriter().write("<h1>欢迎回来,您上一次的访问时间为:"+value+"</h1>"); break; } } } if (cookies == null || cookies.length == 0 || flag == false){ //没有对应的cookie 第一次访问 //设置Cookie的value 获取当前时间的字符串,重新设置Cookie的值 Date date = new Date(); //获取一个当前时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //格式时间 String str_date = sdf.format(date); //解析 str_date = URLEncoder.encode(str_date,"utf-8");//URL编码 Cookie cookie = new Cookie("lastTime",str_date); //new一个cookie存入 cookie.setMaxAge(60*60*24*30);//设置cookie的存活时间是一个月 resp.addCookie(cookie); resp.getWriter().write("<h1>你好欢迎首次访问</h1>"); }
JSP改造登陆日期案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65<%@ page import="java.util.Date" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.net.URLEncoder" %> <%@ page import="java.net.URLDecoder" %><%-- Created by IntelliJ IDEA. User: LZJ Date: 2019/5/16 Time: 19:21 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% //获取所有Cookie Cookie[] cookies = request.getCookies(); boolean flag = false;//没有cookie为lastTime //判断有数据,获取数据,遍历Cookies if(cookies != null && cookies.length >0){ for (Cookie cookie : cookies) { //获取所有Cookies名称 String name = cookie.getName(); if ("lastTime".equals(name)){ //怎么有该cookie不是第一次访问 flag = true; //如果有这个cookie就把flag设置成为true //设置Cookie的value 获取当前时间的字符串,重新设置Cookie的值 Date date = new Date(); //获取一个当前时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //格式时间 String str_date = sdf.format(date); //解析 str_date = URLEncoder.encode(str_date,"utf-8");//URL编码 cookie.setValue(str_date);//存入cookie cookie.setMaxAge(60*60*24*30);//设置cookie的存活时间是一个月 response.addCookie(cookie); //把值写入cookie //响应数据 //获取cookie的value String value = cookie.getValue(); value = URLDecoder.decode(value, "utf-8"); //URL解码 %> <h1>欢迎回来,您上一次的访问时间为:<%=value%>></h1> <% break; } } } if (cookies == null || cookies.length == 0 || flag == false){ //没有对应的cookie 第一次访问 //设置Cookie的value 获取当前时间的字符串,重新设置Cookie的值 Date date = new Date(); //获取一个当前时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //格式时间 String str_date = sdf.format(date); //解析 str_date = URLEncoder.encode(str_date,"utf-8");//URL编码 Cookie cookie = new Cookie("lastTime",str_date); //new一个cookie存入 cookie.setMaxAge(60*60*24*30);//设置cookie的存活时间是一个月 response.addCookie(cookie); %> <h1>您好,欢迎首次登陆</h1> <% } %> </body> </html>
验证码案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39int width = 100; int height = 50; //创建一个对象,在内存中的图片(验证码图片) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //美化图片 Graphics g = image.getGraphics(); //画笔对象 g.setColor(Color.PINK); //设置画笔颜色 g.fillRect(0,0,width,height); //填充宽高 //画边框 g.setColor(Color.BLUE); g.drawRect(0,0,width -1 ,height - 1); String str ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; //创建随机角标 Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i =1;i<=4;i++){ int index = random.nextInt(str.length()); //获取字符 char ch = str.charAt(index); //随机字符 sb.append(ch); //写验证码 g.drawString(ch+"",width/5*i,height/2); } String checkCode_session = sb.toString(); //将验证码存入session req.getSession().setAttribute("checkCode_session",checkCode_session); //画干扰线 g.setColor(Color.GREEN); //随机生成画线坐标点 for(int i =0;i<10;i++){ int x1 = random.nextInt(width); int x2 = random.nextInt(width); int y1 = random.nextInt(height); int y2 = random.nextInt(height); g.drawLine(x1,x2,y1,y2); } //将图片输出页面 ImageIO.write(image,"jpg",resp.getOutputStream());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> //点击超链接或者图片需要换一张 // 1.一定是给超链接和图片绑定点击事件 // 2.修改或者重新设置图片的src值 window.onload=function() { //1获取图片对象 var img = document.getElementById("checkCode"); var a = document.getElementById("change"); //2绑定点击事件 img.onclick = function(){ //加时间戳 var date = new Date().getTime(); img.src="/day13/checkCodeServlet?"+date; } a.onclick = function(){ //加时间戳 var date = new Date().getTime(); a.src="/day13/checkCodeServlet?"+date; } } </script> </head> <body> <img id="checkCode" src="/day13/checkCodeServlet"/> <a id="change" href="">看不清,换一张</a> </body> </html>
文件下载案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//解决文件下载中文乱码工具类 public static String getFileName(String agent,String filename)throws UnsupportedEncodingException { if (agent.contains("MSIE")){ //IE浏览器 filename = URLEncoder.encode(filename,"utf-8"); filename = filename.replace("+"," "); }else if (agent.contains("Firefox")){ //火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; }else{ //其他浏览器 filename = URLEncoder.encode(filename,"utf-8"); } return filename; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28//获取请求参数 String filename = req.getParameter("filename"); //使用字节输入流加载文件进内存 //找到文件服务器路径 ServletContext servletContext = this.getServletContext(); String realPath = servletContext.getRealPath("/img/" + filename); //用字节流关联 FileInputStream fis = new FileInputStream(realPath); //设置resp响应头 //设置响应头类型content-type String mimeType = servletContext.getMimeType(filename); //获取文件的Mime类型 resp.setHeader("content-type",mimeType); //设置响应头打开方式:content-disposition //解决中文文件名问题 //获取user-ageni请求头 String agent = req.getHeader("user-agent"); //使用工具类方法编码文件名 filename = DownLoadUitls.getFileName(agent, filename); resp.setHeader("content-disposition","attachment;filename="+filename); //将输入流的数据写出到输出流中 ServletOutputStream sos = resp.getOutputStream(); byte[] buff = new byte[1024*8]; int len =0 ; while ((len = fis.read(buff)) != -1){ sos.write(buff,0,len); } fis.close();
1
2
3
4
5
6
7
8
9
10
11
12<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--编辑超链接属性,指向servlet,传递资源名称filename--> <a href="/day13/downLoadServlet?filename=a.jpg">图片1</a> </body> </html>
最后
以上就是生动水壶最近收集整理的关于JavaWeb入门必看JavaWeb的全部内容,更多相关JavaWeb入门必看JavaWeb内容请搜索靠谱客的其他文章。
发表评论 取消回复