一、JSTL中的core剩余标签
- <c:out value="${data}" default="木有值" escapeXml="false"></c:out>
- 作用: 输出内容,功能比 ${ } 更强,当data不存在时以默认值输出页面,
- value:获得域对象中的data
- escapeXml:是否转义特殊标签,默认true转义。true表示转义特殊标签,false表示不转义标签。
- <c:set value="aaaa" var="a" scope="request"></c:set>
- 作用&用法:var用来存储变量,,,,,从scope范围取出 ${requestScope.a}:回顾-->web中开发中的常用对象(11大隐式对象)pageScope/requestScope/sessionScope/applicationScope/param/parmaValues/header/headerValues/cookie/initParam
- 可把某些值保存到域中:<c:set value="bbb" var="b" scope="page"></c:set>怎么取? ${pageScope.b}
- 可设置JavaBean的属性值:<c:set target="${ p }" property="name" value="niuyang"></c:set>//p为一个类的域对象
- 可设置Map的key和value值:<c:set target="${ map }" property="k/v" value="kkk/vvv"></c:set> //map为域对象
- <c:catch var="e"> <% int i = 1/0; %> </c:catch> : 捕获异常, ${ e.message };
- <c:choose><c:when></c:when><c:otherwise></c:otherwise></c:choose>
- c:choose不能单独使用,choose中可以只有when,choose不可以只有otherwise,choose中可以有多个when,但只有一个otherwise
- <c:url ><c:param name="username" value="shanjie"></c:param></c:url>如果url要输出的value以"/"开头,访问它时会自动加上当前应用路径、还能对地址进行重写。这样组合可以对中文参数进行编码。
- <c:remove var="a" scope="request"/>在域范围内移除某一个域变量
- <c:import url="/1.jsp"></c:import> : c:import动态包含-
- <c:forTokens items="a,b.c/d" delims=",./" var="s" > ${s}<br/> </c:forTokens>
- 国际化又称为 i18n:internationalization,主要使程序动态产生数据(例如标题栏导航条等固定不变的文本信息),实现软件国际化
- 资源文件名的书写格式:myproperites_zh_CN.properties && myproperites_en_US.properties
- 主要类
- ResourceBundle类读取资源文件
- Locale类实例对象代表特定的地理、政治、文化区域。
- DataFormat国际化日期类
- NumberFormat类
- MessageFormat类(动态文本)
- 模式字符串与占位符----->On {0}, a hurricance destroyed {1} houses and caused {2} of damage.Object [] msgArgs = {date, new Integer(99),new Double(1E7)};
三、JSTL中的fmt简介
- 导入包:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
- 常用标签:
- <fmt:message key="username" bundle="${msg}"></fmt:message>
- <fmt:param></fmt:param>
- <fmt:parseDate></fmt:parseDate>
- <fmt:formatDate></fmt:formatDate>
- <fmt:formatNumber></fmt:formatNumber>
- 对web中的资源进行拦截。“保安”
- 可以放行前对request进行一下更改;放行后可以对response进行更改。
- 编写一个类,实现javax.servlet.Filter接口,要记住在doFilter中用chain调用doFilter(request,response);
- 在web.xml文件中配置filter和filter-mapping,在mapping的url-pattent中配置 /* 表示所有的应用都会被过滤
- 每次访问目标资源,过滤器类的doFilter方法都会执行拦截。参数:FilterChain.doFilter():放行。即让目标资源执行。
- 过滤器的生命周期和servlet的生命周期相似,过滤器在加载应用时就实例化并完成了初始化。
- 解决中文乱码问题get除外
- 原理:在过滤器的doFilter方法中,但该方式只对POST方式管用,要解决全站中文的编码问题在下面案例详述
- request.setCharacterEncoding(encoding); //encoding 从web.xml文件读取
- response.setCharacterEncoding(encoding);
- response.setContentType("text/html;charset=" + encoding);
- 控制动态资源不要缓存,控制静态资源的缓存时间
- 动态资源不要缓存:response.setHeader("Expires", "-1");response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");
- 静态资源缓存时间:response.setDateHeader("Expires", System.currentTimeMillis()+hour*60*60*1000);
- 实现自动登录
- 思路:
- 先从表单页面着手,将表单提交到一个servlet(MyServlet)中处理数据,根据用户名和密码查询出用户,如果返回的用户不为空则放一个cookie名为UserInfo,值用户名+"_"+MD5加密后的密码(以'_'线分割是方便取出用户名和密码好进行session处理,不要忘记添加cookie),并且放入一个session--->user,然后提示登录成功转向主页
- 在过滤器中处理以下信息:如果在session中没有该用户信息则从cookie中取出UserInfo的用户名和密码,再根据用户名向数据库验证一次,根据
- User user = (User) request.getSession().getAttribute("user");
- if (user == null) {
- Cookie[] cookies = request.getCookies();
- for (int i = 0; cookies != null && i < cookies.length; i++) {
- if ("UserInfo".equals(cookies[i].getName())) {
- String value = cookies[i].getValue();
- String username = value.split("\\_")[0];
- String password = value.split("\\_")[1];
- user = UserDB.findUserByUsername(username);// 得到的user中密码是MD5加密后的
- if (password.equals(MD5Util.encode(user.getPassword()))) {
- request.getSession().setAttribute("user", user);
- }
- }
- }
- }
- chain.doFilter(request, response);
- 思路:
- 过滤器映射的dispatcher
- REQUEST:默认的参数值,如果配置了其他值,默认值不在存在,若需要,还要重新配置dispatcher的REQUEST
- INCLUDE:只是动态包含有效
- FORWARD:errorPage是错误的页面,也是属于转发技术,所有配置了FORWARD,errorPage就不用设置ERROR了
- ERROR:注意全局的错误页面在web.xml中配置时,需要用到ERROR值
- 包装BufferedReader类
- 解决全站中文乱码问题
- 思路:主要是在过滤器中设置request的编码和response的编码,但这只限于post提交方式;要解决get提交,解决方法是包装HttpServlertRequestWrapper,对需要重写的方法getParamter(String name)进行功能增强,通过getMethod()判断如果方法是get将数据再编码后(new String(data.getBytes("ISO-8859-1"),"UTF-8"))返回