1.Servlet3.0相较于Servlet2.5
新增了一些注解,简化的javaweb代码开发,可以省略web.xml配置文件 支持异步处理(多线程技术) 支持可插性特性(书写的代码编译后生成的class文件可以直接部署到其他项目的,自动加载执行)
2.web.xml中的welcome-file-list
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
备注:作用是指定首页依次是index.html 。。。。意思是说当web应用中包含index.html页面时,如果直接访问改web应用,系统将会把该页面呈现给浏览者,当index.html不存在的时候一次显示下一个页面,默认的加载顺序,没有就为404
3.servlet接口
常用方法
destroy() //销毁时运行
getServletConfig() //获取servletconfig 先运行
init(ServletConfig servletConfig) //初始化后执行只执行一次 同时可以获取servletconfig 其次运行
service(ServletRequest req, ServletResponse res) //每次访问时会运行
xml配置
<servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>demo1.HelloServlet</servlet-class> <!—加载顺序,值越小优先级越高 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> <!--在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。既带 / 又带扩展名的不合法. --> </servlet-mapping>
备注:在3.0版本中没由xml文件,使用注解配置
4.servletconfig
常用方法
getinitparameter 获取相应的值(<param-value>的值)
getinitparameternames返回所有的<param-name>的值
getServletContext() 获取context对象
getServletName() 获取当前web的名称<servlet-name>的值
<servlet> <servlet-name>helloServlet</servlet-name><!--名称可以随意取需要与<servlet-mapping>中的<servlet-name>保持一致--> <servlet-class>demo1.helloServlet</servlet-class><!--java的包名点类--> <init-param> <param-name>user</param-name> <!-- getinitparameternames 所有的name--> <param-value>root</param-value> <!--对应getinitparameter--> </init-param> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <!--对应getServletName--> <url-pattern>/hello</url-pattern> <!--访问相对地址--> </servlet-mapping>
5.ServletContext
常用方法
getAttribute:获取相应的setAttribute的值
getAttributeNames:获取所有setAttribute的键
getInitParameterNames获取如下中的键<param-name>
getInitParameter 获取相应的<param-name>的<param-value>值
getContextPath 获取当前web文件名
getRealPath(java.lang.String path) 获取path虚拟路径 绝对路径
getRequestDispatcher(java.lang.String path) 转发包装器
getResourceAsStream(java.lang.String path) 返回指定文件作为输入(字节流)
removeAttribute(java.lang.String name) 移除相应的属性
setAttribute(java.lang.String name, java.lang.Object object) 设置相应的属性
<context-param> <param-name>name3</param-name><!--getAttributeNames:所有的name--> <param-value>王五</param-value><!--getInitParameter:值--> </context-param>
6.httpservletrequest
getAttribute(java.lang.String name):获取相应的setAttribute的值
getAttributeNames():类似context
getCharacterEncoding():获取相应的setCharacterEncoding(java.lang.String env)设置的编码集
getContentLength():获取正文长度 没有为-1
getContentType():获取头文件中的类型信息
getProtocol():获取相应的协议
removeAttribute(java.lang.String name):同context
setAttribute(java.lang.String name, java.lang.Object o):同context
setCharacterEncoding(java.lang.String env):设置编码集,防止乱码
getMethod()获取请求方式
getQueryString()获取url的请求字符串 ?后面的内容
getSession()获取session对象,默认为true
getSession(boolean flag):flag 为 true, 则一定会返回一个 HttpSession 对象, 如果已经有和当前 JSP 页面关联的 HttpSession对象, 直接返回; 如果没有, 则创建一个新的返回. flag 为 false: 若有关联的, 则返回; 若没有, 则返回 null
getServletPath() 随根目录下的相对路径
getCookies():获取cookie数组 获取response中的cookie
getParameter(String name):获取传入key对应value的值 表单
getParameterNames():获取所有的传入的key 表单
getParameterValues(String name):获取所有的value,用在checkbox 多选框中 表单
7.httpservletresponse
getWriter():获取输出至页面的通道
reset():清除缓冲区 包含状态码和头文件
setCharacterEncoding(java.lang.String charset):设置输出至页面的字符编码集
setContentType(java.lang.String type):设置内容类型
/*text/plain:纯文本;text/html 纯文本的html application/x-msexcel execl表格
application/x-msword word文件*/
response.setContentType("application/msword")//设置响应类型纯文本的html
sendRedirect(String location): 请求的重定向.
addCookie(Cookie cookie):添加Cookie对象
resetBuffer():清除缓冲区,但是不清楚状态码和头文件
flushBuffer():将缓冲区的内容强制写入
addHeader(String name, String value):添加响应头
containsHeader(String name):查找是否有已命名的响应头
setHeader(String name, String value):设置响应头的值
//禁止缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//手动下载
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//跨域(Access-Control-Allow-Origin值为*并不是太好,其余3个无关紧要可写可不写)
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
8.httpsession 底层以Cookie实现
getAttribute(String name)
getAttributeNames()
getCreationTime():创建的时间 long
getId():获取id
getLastAccessedTime():最后接受事件 long
getMaxInactiveInterval():最大缓存保存时间 默认1800 单位秒
getServletContext():获取ServletContext对象
isNew():是否是新建还是传过来的
removeAttribute(String name):移除属性
setAttribute(String name, Object value):设置属性
setMaxInactiveInterval(int interval):设置最大缓存时间
invalidate():session的销毁
设置过期时间方式1(可以是tomcat和web.xml都可以添加如下设置)
<session-config> <session-timeout>30</session-timeout> </session-config>
设置过期时间方式2
session.setMaxInactiveInterval(30*60);//以秒为单位
优先级:setMaxInactiveInterval>web.xml>web.xml
会话的关闭并不能销毁httpsession 。
9.转发和重定向的区别及相对于绝对路径
1)转发:request.getRequestDispatcher(path).forward(request, response); 页面地址不会发生变化,且request是同一请求 ,在win/inf中的只能通过转发的形式进入,作用范围当前web
/ 代表的是当前 WEB 应用的根目录
2)重定向:response.sendRedirect(path);页面地址会发生变化,且request不是同一请求,作用任何资源,/ 代表的是当前 WEB 站点的根目录.
3)相对路径与绝对路径:在页面中使用相对路径的时候在页面转发时可能会导致页面地址混乱,所以一般建议采用绝对路径
4)web根目录和站点根目录
Web根目录例如:在转发以及xml配置文件mapping中的/表示web的根目录 /index.jsp就是代表的绝对的路径
在 form表单的action,a链接的href以及重定向/表示站点的根目录,
Request.getcontextpath/index.do代表的是绝对的路径
10.cookie:session的底层实现
1)常用方法
getMaxAge():获取cookie最大的保存时间 ,单位秒, 默认值-1,表示关闭浏览器后,cookie会销毁(会话cookie),假如为0表示从客户端电脑或浏览器内存中删除此cookie,为正数,表示保存相应的时间后删除,不论关闭浏览器或关闭电脑,直到时间到才会过期。
getName():获取cookie的键
setMaxAge(int expiry):设置保存的最大时间
Cookie(String name, String value):构造方法
2)Cookie的使用:
构建cookie对象-假如response中保存(addcookie方法)-request获取(同一请求,request.getcookies)
备注:(分号(;)、逗号(,)、等号(=)以及空格。)需要使用URLEncoder.encode,URLDecoder.decode表示是字符而没有特殊的意义
11.filter
1)常用方法:
destroy():销毁时运行 类似于servlet的destroy
doFilter(ServletRequest request, ServletResponse response, FilterChain arg2):请求时触发,类似于servlet的service
init(FilterConfig config)类似于servlet中的init 运行一次 config与servlet中的servletconfig 以及 jsp中的config 都属于ServletConfig ,可以得到servletcontext
2)xml配置
<filter> <!--类似于servlet-name--> <filter-name>encodingFilter</filter-name> <!--类似于servlet-class 支撑类--> <filter-class>helloday10.EncodingFilter</filter-class> <init-param> <param-name>name</param-name> <param-value>root</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <!--类似于servlet中的url-pattern--> <url-pattern>/*</url-pattern> <!--dispatcher只能放在相应的filter-mapping的url下面--> <dispatcher>ERROR</dispatcher> </filter-mapping>
备注:
<dispatcher> 元素的四个属性:REQUEST,INCLUDE,FORWARD和ERROR
1> REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
2> FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
3> INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
4> 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用 例如如下
<error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/test.jsp</location> </error-page>
备注:多个 Filter 拦截的顺序和 <filter-mapping> 配置的顺序有关, 靠前的先被调用
12.listener:监听web的动作
ServletContextListener:监听web应用的开启和销毁(需实现的接口)
方法
contextInitialized(ServletContextEvent arg0) 当前web初始化监听,仅运行一次,也可以放在servlet的init中 也可以放在filter的init中,这些作用都一致(重写的方法) public void contextInitialized(ServletContextEvent arg0) { ServletContext servletContext = arg0.getServletContext(); String config = servletContext.getInitParameter("configLocation"); ApplicationContext ctx = new ClassPathXmlApplicationContext(config); servletContext.setAttribute("ApplicationContext", ctx); }
contextDestroyed(ServletContextEvent arg0):监听当前web的销毁,仅运行一次类似如上中的destroy
xml配置
<listener> <listener-class>helloday12.FileUploadAppListener</listener-class> </listener>
13.url重写
当cookie禁用的时候采用url重写的方式来使其不产生新的sessionid
Response.encodeurl(path)在路径后面自动拼接sessionId,返回值String(新的路径)。在路径的前面加上了Response.encodeurl这样的方法达到url重写来防止cookie的实效,这里对response的重定向不起作用,如下
String path = resp.encodeURL("path"); ServletContext servletContext = getServletContext(); String realPath = servletContext.getRealPath(path); req.getRequestDispatcher(realPath).forward(req, resp);
重定向使用response.encodeRedirectURL("path");
14.上传和下载
需要导入的包为fileupload和io包
DiskFileItemFactory类
常用构造方法
DiskFileItemFactory(),DiskFileItemFactory(int sizeThrehold,File repository)
当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)
方法:
setSizeThreshold(int sizeThreshold):设置是否将上传文件以临时文件的形式保存在磁盘的临界值
setRepository(File repository):文件以临时文件形式保存在磁盘上的存放目录系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取,
ServletFileUpload类
构造方法
public ServletFileUpload(FileItemFactory fileItemFactory),
public ServletFileUpload()。这个方法在解析之前需要使用setFileItemFactory()方法设置 fileItemFactory属性。
常用方法
setSizeMax(long sizeMax):设置上传文件总文件的大小,防止恶意上传
setFileSizeMax(long fileSizeMax):设置单个文件上传的大小
parseRequest(HttpServletRequest):根据表单提交的数据,解析出Form表单中的每一个字段的数据,并将它们分别包装成独立的FileItem对象,然后将这些对象装入一个List类型的集合对象
getItemIterator(HttpServletRequest request):getItemIterator方法和parseRequest 方法基本相同,getItemIterator方法返回的是一个迭代器,该迭代器中保存FileItemStream 对象,假如为了提高性能,那么可以使用这个方法然后做进一步处理
isMultipartContent(HttpServletRequest req) :用于判断请求消息中的内容是否是“multipart/form-data”类型,是则返回true,否则 返回false
setProgressListener(ProgressListener pListener):文件上传进度的监听器
setHeaderEncoding():设置apache读取文件采用的字符集,可以通过System.getProperty("file.encoding"))读取
fileitem方法
isFormField():用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段。如果是普通文本表单字段,返回一个true否则返回一个false。
getName():用来获得文件上传字段中的文件名
getFieldName():用来返回表单标签的name属性的值
getString(java.lang.String encodeing):使用参数指定的字符集编码将主体内容转换成字符串
getString():使用缺省的字符集编码将主体内容转换成字符串
getSize():返回上传文件的大小
getInputStream():以流的形式返回上传文件的主体内容
delete():用来清空FileItem对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文件删除。
isInMemory():判断FileItem对象封装的数据是保存在内存中还是硬盘中。
getContentType():用来获得上传文件的类型
上传文件
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置临界值,将会采用系统默认值10KB。(是否保存到临时文件的临界值) factory.setSizeThreshold(1024 * 1); File tempDirectory = new File("d:\tempDirectory"); //保存到临时文件的目录 factory.setRepository(tempDirectory); //创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); // setFileSizeMax(long fileSizeMax):设置单个文件上传的大小 //总共上传文件大小 upload.setSizeMax(1024 * 1024 * 1); try { //获取文件,每一个FileItem对应一个Form表单的输入项 List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { //判断是否是表单 if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); System.out.println(name + ": " + value); } //否则作为文件处理 else { //获取name的字段名 String fieldName = item.getFieldName(); //获取文件名 String fileName = item.getName(); //获取contentType信息 String contentType = item.getContentType(); //获取上传文件大小 long sizeInBytes = item.getSize(); System.out.println(fieldName); System.out.println(fileName); System.out.println(contentType); System.out.println(sizeInBytes); InputStream in = item.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; fileName = "d:\files\" + fileName; System.out.println(fileName); OutputStream out = new FileOutputStream(fileName); while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } out.close(); in.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } }
15.国际化
Dateformat类
getDateInstance(int style, Locale aLocale) :获取日期显示对象
getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):参数 style风格,含dateformat.full/short/long/medium,获取日期和时间显示对象
getTimeInstance(int style, Locale aLocale):获取时间的显示对象
format(Date date):匹配日期
parse(String source):将相应的的字符串变换时间格式,这个需要dateformat的格式保持一致
numberformat类
getCurrencyInstance(Locale inLocale):返回货币
format(long number) 格式规范
getNumberInstance(Locale inLocale) 返回数字
parse(String source):解析字符
messageformat类
format(String pattern, Object... arguments):pattern匹配的字符串 arguments参数
public static void main(String[] args) { String str="date:{0},salary:{1}"; Locale locale = Locale.CHINA; Date date = new Date(); DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.LONG, locale); String format = dateInstance.format(date); double i=123.4; NumberFormat instance = NumberFormat.getCurrencyInstance(locale); String format3 = instance.format(i); String format2 = MessageFormat.format(str, format,format3); System.out.println(format2); }
ResourceBundle类
getBundle(String baseName, Locale locale) 静态方法返回ResourceBundle类 basename指配置的名称,如i18n,配置的全名为i18n.properties;当设置国家后自动匹配,正文书写 i18n_zh_CN.properties;英文书写i18n_en_US.properties 获取相应的对象
getObject(String key):获取相应properties文件中的键的值
16.注解
假如顶层中的<web-app>中的metadata-complete的属性设置为true,则忽略所有备注相应注解 如果需要使用注解则需要相应设置为false
@webservlet
属性
Name string 等价于<servlet-name>
Value String【】 等价于urlpatterns属性,不能与urlpatterns同时使用
Urlpatterns String【】 等价于<url-pattern>
Loadonstartup int 等价于<load-on-startup> 加载顺序 中间的值越小,优先级就越高
Initparams webintiparam【】 等价于<init-param>
Asyncsupported Boolean 声明servlet是否支持异步工作 等价于<async-supported>
Description string 描述信息 等价于< Description >
Displayname string servlet的显示名 等价于<display-name>
@webinitparam 需要与@webservlet 或者@webfilter配合使用
Name string 等价于<param-name>
Value string 等价于<param-value>
Description string 等价于 <description>
@webfilter
filterName string 等价于<filtert-name>
Value String【】 等价于urlpatterns属性,不能与urlpatterns同时使用
Urlpatterns String【】 等价于<url-pattern>
Servletnames string[] 指定应用于哪些servletx相当于<servlet-name>
Dispatchtypes dispatchertype 过滤器的转发模式 值包括error forward include和request这些在前面的filter中有说明
Initparams webintiparam【】 等价于<init-param>
Asyncsupported Boolean 声明servlet是否支持异步工作 等价于<async-supported>
Description string 描述信息 等价于< Description >
Displayname string servlet的显示名 等价于<display-name>
用法实例
@WebServlet( displayName = "UserServlet" , //描述 name = "UserServlet", //servlet名称 urlPatterns = { "/user" }, //url loadOnStartup = 1, //启动项 initParams = { @WebInitParam(name = "username", value = "张三") } )//初始化参数