web部分笔记
2017/8/1
流程
创建动态Web项目
选择Dynamic Web module version
对应Tomcat版本: tomcat6.0对应2.5,tomcat7.0对应3.0,tomcat8对应3.1
输出路径: eclipse中新建web项目的时候默认路径为build\classes, 服务器的Class Loader类加载器默认加载/WEB-INF/classes目录下的.class文件 , 创建时应该设置为WebContent/WEB-INF/classes
创建JSP文件
注意编码格式UTF-8
配置tomcat服务器
选择tomcat版本
创建servlet
从而响应客户端的链接访问
在servlet里获取请求
service层进行逻辑操作
dao层进行数据操作
这三层紧密关联,上层可以获取下层并且进行操作
在服务器上运行
Servlet
使用Servlet的目的:接收客户端的请求并且做出响应
解析HTTP请求: URI 包括 URL 和 URN,后者不可以定位到资源
http请求:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
请求方式 /uri地址 http协议版本
Host:主机地址
Connection:(默认持续)连接方式
其它键值对包括:响应格式、浏览器版本、cookie等等
get和post
get 参数键值对 uri?key=value&key=value 明文
post 参数同样是键值对,但不在uri后,而在请求正文
http响应:
协议版本 响应状态码
设置tomcat的server.xml文件
path web:应用的url入口
docBase web:应用的文件路径
reloadable :是否自动加载更新的web应用
tomcat首先会到conf/context.xml查找Context.xml
写一个Servlet的方法
创建Servlet类
继承HttpServlet
重写doPost() doGet()方法
直接使用eclipse的创建Servlet选项
2017/8/31
使用web.xml文件配置servlet
<web-app>
<servlet>
<servlet-name> Servlet 的名字</servlet-name>
<servlet-class> Servlet (包括包在内)的类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> Servlet 的名字</servlet-name>
<url-pattern> 访问Servlet的url的相对路径 </url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file> 作为默认主页的页面 </welcome-file>
</welcome-file-list>
</web-app>
使用注解
@WebServlet(“/uri路径”)
(name=”ServletName”,
urlPatterns={“/url”})
不需要在web.xml文件中配置节点
2017/9/1
Servlet内置对象
HttpRequest对象
假如url是:localhost:8080/ServletProject/Login
获取uri信息:地址+端口/后的所有部分 getRequestURI() /ServletProject/Login
获取Servlet的url路径 getServletPath() /Login
获取工程的站点名 getContextPath() /ServletProject
获取绝对路径(不使用) getRealPath() 文件系统的路径D:\webapp\..
获取请求方法 getMethod()
获取请求头 getHeader()
获取客户端ip getRemoteAddr()
获取所有参数名 getParameterNames()
获取所有参数键值对 getParameterMap()
根据参数名获取参数值 getParameter(String key)
获取有多个参数值的数组 getParameterValues(String key)
@MultipartConfig注解
获取区域的数据 getPart(name)
得到Part类型的对象,分为头部信息getHeader(“信息的类型”)、数据部分getInputStream()等,获得InputStream 就可以保存文件
路径使用ServletContext getRealPath("相对路径")获取
分隔符Filie.separator
文件名使用part.getSubmitedFileName()直接获取(tomcat7不行,只能正则处理)
RequestDispatcher对象
getRequestDispatcher(“servlet链接url”)获取
转发对象也可以是一个jsp
转发:将请求通过forward(request,response)方法转发给另一个servlet处理
接入:使用include()将另一个servlet的内容在当接入当前servlet
这两个概念可以跟jsp里的概念比较
另外通过response.sendRedirect(“目标”)可以进行重定向
不同之处是request会失效, 相当于重新做一次请求,因此这个路径不同于转发,必须是绝对路径!!!
或者直接去掉“/” ,直接重定向到另一Servlet
(转发方式的先天优势:
在getRequestDispatcher(url)方法中封装了
ServletContext.getRealPath()以获得相应的项目根路径)
HttpResponse对象
实现响应处理
添加响应头信息 addHeader(name,value)
获取打印流(输出字符用html/json/xml) getWriter()
获取输出流(用来输出文件) getOutputStream()
设置响应头,让浏览器下载文件,而不是直接打开文件
getResource() getResourceAsStream()
ServletContext对象 和 ServletConfig对象
ServletConfig 初始化对象
获取初始化数据 getInitParameter(key)
(传统方法)这些数据在web.xml文件中使用<init-param></init-param>初始化配置
(注解) @WebServlet(initParams={
@WebInitParam(name="键",value="值"),
@WebInitParam(name="键",value="值")
获取所有初始化参数 getInitParameterNames()
ps:得到的是一个Enumeration枚举对象
获取Servlet名
getServletName()
获取ServletContext对象 getServletContext()
ServletContext 与容器的通信接口 每个web应用都有一个
所有Servlet共享一个ServletContext
保存数据到对象中 setAttribute(name, object)
获取数据 getAttribute(name)
2017/9/6
web会话管理
1 、网址重写:
url ? token 的形式
每次请求的时候,主动把token加到http header里面或者url后面
2 、使用隐藏域:
将上一个页面传递过来的数据写到一个不显示的input标签中
就是使用隐藏域进行会话管理
(页面太多时就太过复杂)
3 、基于cookie(存在浏览器)
是键值对
创建cookie对象
添加addCookie()
使得用户不需要在每次进入网站时都进行登陆操作
4 、基于session(存在服务端)
(HttpSession) getSession()
session.setAttribute( “key” , value )
(Object)session.getAttribute( “key” )
页面保护
数据保存
2017/9/7
Servlet处于多线程环境下,因此不要共享变量
过滤器
配置filter过滤器
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
<inti-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>'filter的名字'</filter-name>
<url-pattern>'访问的链接地址'</url-pattern>
</filter-mapping>
或者使用注解@WebFilter
创建自定义过滤器类,实现FIiter接口
复写三个方法
初始化方法: init(FilterConfig)获取在web.xml中设置的初始化参数
使用FilterConfig.getInitParam("参数名")获取参数
过滤方法doFilter( ServletRequest , ServletResponse ,FilterChain)
销毁方法destory():
可以用来处理中文乱码:在过滤方法中设置request和response的编码格式
可以用来对访问者身份进行判断拦截,编辑页面的保护
监听器
监听web容器的有效事件
针对session/request/context对象的行为进行监听
实现Listener接口+(在需要监听的Servlet前添加)注解@WebListener
或者在web.xml中做监听声明
ServletContextListener 监听WEB 应用启动和销毁的事件
(在应用启动时读取历史访问人数)写一个监听用户访问次数的实例
ServletContextAttributeListener 监听WEB应用属性改变的事件
HttpSessionListener 监听HttpSession的创建销毁操作
一个客户端访问时会创建一个session
在线人数:已登录未注销的人数进行统计
HttpSessionBindingListener 监听对象加入session或被移除的操作
HttpSessionActivationListener 主要用于同一个Session转移至不同的JVM的情形
感知自己何时随着HttpSession钝化/激活。
HttpSessionAttributeListener 监听HttpSession中的属性的操作
ServletRequestListener 监听request的创建和销毁
ServletRequestAttributeListener 监听request中的属性的操作
会实现监听到变化时自动执行后的方法
2017/9/8
JSP
本质是一个Servlet,html+JAVA
自动编写java文件进行
指令标识
<%@ 指令名 属性=”属性值” %>
page指令,设置页面属性
include指令,静态包含另一页面
taglib指令,引用标签库
脚本标识
<%! 声明的变量或方法%>定义全局的变量或方法
<%= 表达式%>向页面输出信息
<% java代码或脚本代码%> 在这里定义的变量是局部的,都在service()方法内
注释
//
/**/
/**
*/
<%- %>
动作标识
<jsp:include page="url">动态包含
<jsp:forward page="url">请求转发,将页面跳转
<jsp:param name="参数名" value="参数值"/>
2017/8/2
JSP内置对象
request对象
在连接url后面加上 ?对象名=”值”
向目标连接发送一个对象
访问请求参数
在目标jsp使用request.getParameter("对象名")获取值
在作用域中传递参数
request.setAttribute(String name ,Object obj)在转发前的页面保存数据
request.getAttribute(String name )在转发后的页面读取数据
获取cookie
cookie 是键值对
Cookie cookie=new Cookie(key,value);
中文乱码
将值进行编码转换UTF-8
request请求都是IOS-8859-1
获取客户端信息
2017/8/3
response对象
重定向
response.sendRedirect(String path)
处理http响应报头
禁用缓存、设置自动刷新、定时跳转网页
设置输出缓冲
session对象
会话,在页面跳转时一直保存,直到关闭浏览器,或者长时间没动作
比request里所保存的数据存活更久
session.setArttibute(String name ,Object obj)
session.getArttibute(String name)
removeArttibute(String name)移除变量
session.invalidate()销毁session
setMaxInactiveInterval(秒数)设置生命周期
application对象
全局变量,在服务器启动时创建,停止时销毁
标签在web.xml文件配置应用程序初始化参数
application.getInitParameter(String name)
( Enumeration ) application.getAttributeNames 获取所有初始化参数名
其余与session类似,生命周期更长
out对象
输出信息print()
其它对象
pageContext对象
config对象
page对象
exception对象
2017/9/11
EL表达式
${key}直接访问已经存在四个作用域中的对象
${作用域.key}
${key.属性}
${list[1]}
${set.iterator().next()}
${}
<jsp-config></jsp-config>
用来代替复杂的request.get。。。。。。
param参数
paramValues存储多数据,chekbox 复选框
2017/8/7
JavaBean
例子1:将数据通过JSP的request对象传递,使用这个数据实例化一个对象
调用方法进行判断,然后在页面进行输出
属性定义为私有,提供公有访问方法
使用<jsp:useBean>标签获取属性
<jsp:useBean id=" " class=" " >
<jsp:getProperty property="变量名" name="">
<jsp:setProperty property="变量名" name="" value="值">
2017/9/12
jstl标签库
需要jar包
在文件头部导入库
比如c标签
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:out/>输出内容
<c:forEach/>遍历集合、数组
items=“” el表达式表示的集合对象
var=“” 取出来的一个对象的名字
step=“” 间隔
varStatus="" 当前行的名字,用来取出count之类的值last first
begin
end
<c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的状态" begin="循环从哪儿开始" end="循环到哪儿结束" step="循环的步长">
循环要输出的东西
</c:forEach>
2017/9/13
标签库实现国际化
页面的文字多语言显示
http请求头有语言
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:setLocale value="zh_CN"/>
<fmt:bundle basename="text">
<center>
<table>
<tr>
<td><fmt:message key="text2"/></td>
</tr>
</table>
</center>
</fmt:bundle>
创建一个存储文本数据的文本.properties
中文自动转换为UNICODE
text1=\u8FD9\u4E2A\u662F\u7B2C\u4E00\u53E5\u6587\u5B57
text2=\u8FD9\u4E2A\u662F\u7B2C\u4E8C\u53E5\u6587\u5B57
自定义标签
创建tld文件定义标签
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>newtag</description>
<tlib-version>1.0</tlib-version>
<short-name>newtag</short-name>
<uri>http://com.gec.myfirsttag</uri>
<tag>
<!-- 标签名 -->
<name>newtag</name>
<!-- 标签对应的类 -->
<tag-class>web.rz.tag.NewTag</tag-class>
<!-- 主体内容 -->
<body-content>empty</body-content>
<attribute>
<name>collection</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue> 支持动态数据
</attribute>
</tag>
</taglib>
NewTag继承SimpleTagSupport
doTag()输出标签的内容
前提:提供对象的set/get方法
然后doTag方法里操作
getJspContext().getOut().println("new tag<br/>");
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
getJspContext().getOut().println(object+"<br/>");
}
在jsp文件里使用
<%@ taglib uri="/WEB-INF/newtag.tld" prefix="easy"%>