学习Javaweb也有好多天了,都是零零散散的学习,并没有系统化。今天上午做完算法题,下午就来总结一下Javaweb的一些小的知识,这篇文章知识针对我我自己的一些不理解的地方,易忘记的一些知识点。(本文按照how2j网站编写,相当于自己的学习笔记)
第一个知识点:
http://127.0.0.1/login.html访问的是html页面,http://127.0.0.1/login访问的是login映射的servlet
第二个知识点:servlet和前端的调用流程
第三个知识点:转发与重定向
第三个知识点:request的常用方法
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POSTrequest.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
上边标红的是最常用的一些方法!!!
第四个知识点:response的常用方法
response.setContentType("text/html; charset=UTF-8");//设置相应编码
response.sendRedirect("fail.html");//设置从定向的功能
第五个知识点:文件上传
这个我会单独的写一篇文章来说明这个功能
第六个知识点:关于访问路径的问题
比如这个addHero.html文件,是放在abc目录下。
那么<form action="addHero" method="post"> 就表示访问路径: /abc/addHero
而<form action="/addHero" method="post"> 表示访问路径: /addHero
第七个知识点:若遇到更新数据的业务需求
那就必须增加一行type="hidden"的input,用于提交id到路径/updateHero
如下图所示:(下面只是其中一种思路,当然可以直接将id值从一个jsp种传入另一个jsp种,这两种方式的关键点就是获取id值并修改相应的信息)
第八个知识点:jsp的执行流程
第九个知识点:jsp中的元素
第十个知识点:什么是cookie以及他的应用
Cookie是一种浏览器和服务器交互数据的方式。Cookie是由服务器端创建,但是不会保存在服务器。创建好之后,发送给浏览器。浏览器保存在用户本地。下一次访问网站的时候,就会把该Cookie发送给服务器。
有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态。如果你选了,那么一周之内,都不需要再输入账号密码。这个功能,就是靠cookie来实现的。
第十一个知识点:session原理
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。
第十二个知识点:JSTL和EL
JSTL通过<c:if test=""> 进行条件判断但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反,配合if使用的还有通过empty进行为空判断,empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0
借助JSTL的c:forEach标签,可以改善可读性,分别使用for循环和<c:forEach标签来演示遍历一个List的区别
<c:forEach items="${heros}" var="hero" varStatus="st" >
items="${heros}" 表示遍历的集合
var="hero" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态
使用JSTL还有一个最最最最易错的地方,就是忘记了<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>这个地方也是我之前出现错误最多的地方。
第十三个知识点:判断用户是否登陆
比如网站提供Hero查询服务,但是前提是用户要登录过才能使用。 如果用户登陆过了,访问listHero,就让用户正常访问,否则就跳转到登陆界面。 这是非常常见的场景,通过使用 session 来实现这个功能。 在处理登录的loginServlet 中使用将用户名保存在session中。 在HeroListServlet 中查看session中是否为空。如果为空,就表示用户没有登陆过,就跳转到登陆页面
第十四个知识点:Filter原理与使用
Filter最常用的两种方式是设置编码和登陆验证
设置编码:
package filter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EncodingFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
登陆验证:
package filter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String uri = request.getRequestURI(); if (uri.endsWith("login.html") || uri.endsWith("login")) { chain.doFilter(request, response); return; } String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。
这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问呢package filter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String uri = request.getRequestURI(); //如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录 if (uri.endsWith(".css") || uri.endsWith(".js")) { chain.doFilter(request, response); return; } if (uri.endsWith("login.html") || uri.endsWith("login")) { chain.doFilter(request, response); return; } String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
就总结到这吧,我感觉这些内容是我要必须多看的内容,继续努力吧!