jsp/servlet基础知识
2016-05-18 14:55
666 查看
不使用IDE构建web项目:
< webDemo >
|–WebRoot
| |-WEB-INF
| | |-classes
| | |-lib
| | |-web.xml
| |-styles
| |-jsp
| |-images
| |-js
|–src
将webDemo复制到tomcat的me-webapps中即可完成部署。
Jsp会编译成Servlet再运行,Servlet放在tomcat的work/catalina目录中
Servlet类中主要包含init(),destroy(),service()三个方法。
在service()方法中已经有了九个内置对象,2个形参,7个局部变量,所以在jsp中我们可以直接使用。
< %–jsp注释–%>无法通过源代码查看到
< !–jsp注释–%>可以通过源代码查看到
<%! 声明部分 %>声明的是成员变量,在创建实例时初始化,将一直保存,直到实例销毁。
<%=表达式%>代替了out.prinln输出语句
jsp脚本中声明的是局部变量。
JSP3个编译指令:page、include、taglib
编译指令是通知JSP引擎的消息,不直接生成输出,在编译成Servlet时起作用。<%@ 编译指令 %>一般放在JSP最前面。
JSP动作指令:
jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getProperty
执行forward指令时,用户请求的地址没有改变,页面内容完全被forward目标页的内容替换。因为< jsp:forward>并没有重新向新页面发送请求,它只是完全采用了新页面来对用户生成相应,请求仍然是一次请求,所以请求参数、请求属性都不会丢失。
静态导入和动态导入的区别:
1、静态导入是被导入页面的代码完全融入,融合成一个整体Servlet,而动态导入则是使用include方法引入被导入的内容。
2、静态导入时编译指令会起作用,而动态导入编译指令失去作用,只是插入被导入页面的body内容。
3、动态导入可以增加额外的参数。
useBean、setProperty、getProperty都是与JavaBean相关。
application可以再整个Web应用的多个JSP、Servlet之间共享数据。还可以访问Web应用的配置参数。
Servlet中没有内置对象,每个Web应用中只有一个ServletContext实例。
application.getInitParameter()访问配置参数。
< %=%>的本质就是out.write()
request对象用来获取请求头、请求参数。
当有多个请求参数时调用request.getParameterValues(),如checkbox
request.getQueryString()获取请求参数。
request.getRequestDispatcher(“/jsp/showFile.jsp”).forward(request, response); 必须斜线开头
客户端发送请求参数有两种情况:
1、Get请求会将请求参数的名和值才转换成字符串,并附加在原URL之后,可以在地址栏中看到请求参数名和值,传送数据量小。
2、Post请求常用来提交表单,请求参数和对应值放在html header中传输,地址栏看不到。
response
out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,所以当要响应非字符的时候就要用到response。此时contentType应该指定响应类型,例如”image/jpeg”
response可以重定向response.sendRedirect(“redirect-result,jsp”);
重定向地址栏不会改变,所有的请求参数和request范围内的属性全部丢失,执行第二次请求。
response可以用来增加cookie,增加cookie的步骤如下:
1、创建cookie实例
2、设置cookie生命期限
3、向客户端写cookie
cookie值不能出现中文字符,如果需要的话要先编码再解码。
session机制通常用于保存客户端的状态信息,这些状态信息要保存在Web服务器里,所以要求session属性值必须是可序列化的,
Servlet
创建servlet实例有两个时机:
1、客户端第一次请求Servlet时,系统创建该Servlet实例,大部分Servlet都是这种。
2、Web应用启动时创建Servlet实例,load-on-startup Servlet.
Servlet的生命周期:
1、创建Servlet实例
2、Web容器调用Servlet的init方法,对Servlet进行初始化。
3、Servlet初始化后,一直存在于容器中,用于相应客户端请求。如果客户端发送GET请求,容器调用Servlet的doGet方法来处理并相应请求。
4、Web容器决定销毁Servlet时,调用Servlet的destroy方法。通常在关闭Web应用的时候销毁。
load-on-startup Servlet通常用于提供重要的后台服务。
配置load-on-startup Servlet的两种方式:
给servlet配置参数两种方式:
1、@WebServlet的initParams属性
2、xml 的< init-param>属性
servlet配置参数由ServletConfig的getInitParameter(arg0);方法来获取初始化参数。
jsp使用标签来取代jsp脚本。开发标签库的步骤:
1、开发自定义标签处理类
~~如果标签类包含属性,每个属性都应该有对应的getter和setter方法
~~重写doTag()方法,负责生成页面内容
2、建立一个tld(tag library definition)文件,每个tld文件对应一个标签库,每个标签库可以包含多个标签
~~taglib的三个元素:tlib-version、short-name、uri、tag(可有多个)
~~有属性的标签要为< tag>元素加上< attribute>子元素,子元素通常指定name,required,fragment子元素
3、在jsp中使用自定义标签
~~使用标签库需要标签库URI(用tablib编译指令)和标签名
<%@ taglib uri=”tagliburi” prefix=”tagPrefix”%>
< tagprefix:tagName tagAttribute=”tagValue”>
带标签体的标签是指可以在标签内嵌入其他内容。
在严格的MVC规范下,JSP页面只负责显示数据,而数据通常在控制器放入request范围内,JSP页面就可以通过iterator标签迭代输出。
以页面片段为属性的标签
1、标签处理类定义类型为JspFragment的属性,这个属性代表页面片段。
2、使用< jsp:attribute >动作指令为标签库属性指定值。
Filter
使用Filter是完整流程是:
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成相应,最后Filter在对服务器响应进行后处理。
Filter的几个用途:
1、在HttpServletRequest到达Servlet之前。拦截客户的HttpServletRequest
2、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3、在HttpServletRespose到达客户端之前,拦截HttpServletRespose
4、根据需要检查HttpServletRespose,也可以修改HttpServletRespose头和数据。
Filter有以下几个种类:
1、用户授权的Filter
2、日志Filter
3、负责解码的Filter
4、能改变XML内容的XSLT Filter等
5、Filter可负责拦截多个请求或响应。
Filter创建2个步骤:
1、创建Filter处理类
2、通过Annotation或者web.xml在文件中配置Filter
Filter跟servlet其极其相似,只是Filter里的doFileter()方法多了一个FilterChain的参数,通过这个参数控制是否放行用户请求。
Listener
ServletAPI提供了大量监听器来监听Web应用的内部事件。使用Listener两个步骤:
1、定义Listener实现类
2、通过Annotation或者web.xml在文件中配置Listener
ServletContextListener监听web应用的启动和关闭,获取的是Web应用的配置参数,而不像servlet和filter获取本身的配置参数。
ServletContextAttributeListener监听ServletContext范围(application)内属性的改变。
ServletRequestListener监听用户请求
ServletRequestAttributeListener监听ServletRequest范围内属性的改变
HttpSessionListener监听用户session的开始和结束。
HttpSessionAttributeListener监听HttpSession范围内属性的改变
表达式语言
表达式语言的内置对象:
pageContext、pageScope、requestScope、sessionScope、applictionScope、param、paramValues 、header、headerValues、initParam、cookie
表达式语言自定义函数开发步骤:
1、开发函数处理类
2、使用标签库定义函数
3、在JSP页面的EL中使用函数,一样先导入标签库,然后再使用函数
改进的servletAPI可以直接上传了,使用post方法,enctype=”multipart/for-data”。必须要使用@MultipartConfig修饰
< webDemo >
|–WebRoot
| |-WEB-INF
| | |-classes
| | |-lib
| | |-web.xml
| |-styles
| |-jsp
| |-images
| |-js
|–src
将webDemo复制到tomcat的me-webapps中即可完成部署。
Jsp会编译成Servlet再运行,Servlet放在tomcat的work/catalina目录中
Servlet类中主要包含init(),destroy(),service()三个方法。
在service()方法中已经有了九个内置对象,2个形参,7个局部变量,所以在jsp中我们可以直接使用。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; /** *下面都省略 */ }
< %–jsp注释–%>无法通过源代码查看到
< !–jsp注释–%>可以通过源代码查看到
<%! 声明部分 %>声明的是成员变量,在创建实例时初始化,将一直保存,直到实例销毁。
<%=表达式%>代替了out.prinln输出语句
jsp脚本中声明的是局部变量。
JSP3个编译指令:page、include、taglib
编译指令是通知JSP引擎的消息,不直接生成输出,在编译成Servlet时起作用。<%@ 编译指令 %>一般放在JSP最前面。
JSP动作指令:
jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getProperty
执行forward指令时,用户请求的地址没有改变,页面内容完全被forward目标页的内容替换。因为< jsp:forward>并没有重新向新页面发送请求,它只是完全采用了新页面来对用户生成相应,请求仍然是一次请求,所以请求参数、请求属性都不会丢失。
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "index.jsp", out, false);
静态导入和动态导入的区别:
1、静态导入是被导入页面的代码完全融入,融合成一个整体Servlet,而动态导入则是使用include方法引入被导入的内容。
2、静态导入时编译指令会起作用,而动态导入编译指令失去作用,只是插入被导入页面的body内容。
3、动态导入可以增加额外的参数。
useBean、setProperty、getProperty都是与JavaBean相关。
application可以再整个Web应用的多个JSP、Servlet之间共享数据。还可以访问Web应用的配置参数。
Servlet中没有内置对象,每个Web应用中只有一个ServletContext实例。
ServletContext sc=getServletConfig().getServletContext(); String username=(String)application.getInitParameter("username");
application.getInitParameter()访问配置参数。
<context-param> <param-name>showDirectory</param-name> <param-value>D:\\Program Files</param-value> <description>要展示的根目录</description> </context-param>
< %=%>的本质就是out.write()
request对象用来获取请求头、请求参数。
byte[] src= new String("实现从GBK到UTF-8的转变").getBytes("GBK"); byte[] dst = new String(src, "GBK").getBytes("utf-8");
当有多个请求参数时调用request.getParameterValues(),如checkbox
request.getQueryString()获取请求参数。
request.getRequestDispatcher(“/jsp/showFile.jsp”).forward(request, response); 必须斜线开头
客户端发送请求参数有两种情况:
1、Get请求会将请求参数的名和值才转换成字符串,并附加在原URL之后,可以在地址栏中看到请求参数名和值,传送数据量小。
2、Post请求常用来提交表单,请求参数和对应值放在html header中传输,地址栏看不到。
response
out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,所以当要响应非字符的时候就要用到response。此时contentType应该指定响应类型,例如”image/jpeg”
response可以重定向response.sendRedirect(“redirect-result,jsp”);
重定向地址栏不会改变,所有的请求参数和request范围内的属性全部丢失,执行第二次请求。
response可以用来增加cookie,增加cookie的步骤如下:
1、创建cookie实例
2、设置cookie生命期限
3、向客户端写cookie
cookie值不能出现中文字符,如果需要的话要先编码再解码。
Cookie cookie=new Cookie("user",URLEncoder.encode("叶世武", "gbk")); cookie.setMaxAge(24*3600); response.addCookie(cookie); Cookie[] cookies=request.getCookies(); for(Cookie c:cookies){ out.println(c.getName()+""+URLDecoder.decode(c.getValue(),"gbk")); }
session机制通常用于保存客户端的状态信息,这些状态信息要保存在Web服务器里,所以要求session属性值必须是可序列化的,
Servlet
创建servlet实例有两个时机:
1、客户端第一次请求Servlet时,系统创建该Servlet实例,大部分Servlet都是这种。
2、Web应用启动时创建Servlet实例,load-on-startup Servlet.
Servlet的生命周期:
1、创建Servlet实例
2、Web容器调用Servlet的init方法,对Servlet进行初始化。
3、Servlet初始化后,一直存在于容器中,用于相应客户端请求。如果客户端发送GET请求,容器调用Servlet的doGet方法来处理并相应请求。
4、Web容器决定销毁Servlet时,调用Servlet的destroy方法。通常在关闭Web应用的时候销毁。
load-on-startup Servlet通常用于提供重要的后台服务。
配置load-on-startup Servlet的两种方式:
1、 @WebServlet(loadOnStartup=1) 2、 <servlet> <servlet-name>timerServlet</servlet-name> <servlet-class>lee.TimerServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
给servlet配置参数两种方式:
1、@WebServlet的initParams属性
2、xml 的< init-param>属性
servlet配置参数由ServletConfig的getInitParameter(arg0);方法来获取初始化参数。
jsp使用标签来取代jsp脚本。开发标签库的步骤:
1、开发自定义标签处理类
~~如果标签类包含属性,每个属性都应该有对应的getter和setter方法
~~重写doTag()方法,负责生成页面内容
2、建立一个tld(tag library definition)文件,每个tld文件对应一个标签库,每个标签库可以包含多个标签
~~taglib的三个元素:tlib-version、short-name、uri、tag(可有多个)
~~有属性的标签要为< tag>元素加上< attribute>子元素,子元素通常指定name,required,fragment子元素
3、在jsp中使用自定义标签
~~使用标签库需要标签库URI(用tablib编译指令)和标签名
<%@ taglib uri=”tagliburi” prefix=”tagPrefix”%>
< tagprefix:tagName tagAttribute=”tagValue”>
带标签体的标签是指可以在标签内嵌入其他内容。
private String collection; private String item; public void doTag()throws JspException,IOException{ Collection itemList=getJspContext().getAtttribute(collection); for(Object s:itemList){ getJspContext().setAtttribute(item,s); getJspBody().invoke(null); } } <mytag: iterator collection="a" item="item"> <tr> <td>${pageScope.item}</td> </tr> </mytag: iterator>
在严格的MVC规范下,JSP页面只负责显示数据,而数据通常在控制器放入request范围内,JSP页面就可以通过iterator标签迭代输出。
以页面片段为属性的标签
1、标签处理类定义类型为JspFragment的属性,这个属性代表页面片段。
2、使用< jsp:attribute >动作指令为标签库属性指定值。
Filter
使用Filter是完整流程是:
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成相应,最后Filter在对服务器响应进行后处理。
Filter的几个用途:
1、在HttpServletRequest到达Servlet之前。拦截客户的HttpServletRequest
2、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3、在HttpServletRespose到达客户端之前,拦截HttpServletRespose
4、根据需要检查HttpServletRespose,也可以修改HttpServletRespose头和数据。
Filter有以下几个种类:
1、用户授权的Filter
2、日志Filter
3、负责解码的Filter
4、能改变XML内容的XSLT Filter等
5、Filter可负责拦截多个请求或响应。
Filter创建2个步骤:
1、创建Filter处理类
2、通过Annotation或者web.xml在文件中配置Filter
Filter跟servlet其极其相似,只是Filter里的doFileter()方法多了一个FilterChain的参数,通过这个参数控制是否放行用户请求。
Listener
ServletAPI提供了大量监听器来监听Web应用的内部事件。使用Listener两个步骤:
1、定义Listener实现类
2、通过Annotation或者web.xml在文件中配置Listener
ServletContextListener监听web应用的启动和关闭,获取的是Web应用的配置参数,而不像servlet和filter获取本身的配置参数。
ServletContextAttributeListener监听ServletContext范围(application)内属性的改变。
ServletRequestListener监听用户请求
ServletRequestAttributeListener监听ServletRequest范围内属性的改变
HttpSessionListener监听用户session的开始和结束。
HttpSessionAttributeListener监听HttpSession范围内属性的改变
表达式语言
表达式语言的内置对象:
pageContext、pageScope、requestScope、sessionScope、applictionScope、param、paramValues 、header、headerValues、initParam、cookie
表达式语言自定义函数开发步骤:
1、开发函数处理类
2、使用标签库定义函数
3、在JSP页面的EL中使用函数,一样先导入标签库,然后再使用函数
改进的servletAPI可以直接上传了,使用post方法,enctype=”multipart/for-data”。必须要使用@MultipartConfig修饰
相关文章推荐
- js操作数组的一些小技巧
- js面向对象(构造函数与继承)
- JS replace 全部替换
- js的随机数生成器,不再使用Math.random
- [转载]javascript 隐性类型转换步骤
- j2ee中的重定向和转发
- js的继承
- Javascript--装饰器模式和观察者模式
- [repost]State of the Art JavaScript in 2016
- 自动提取HTML中的JS进行合并与压缩
- js判断undefined类型
- ssh框架与json的整合,没导入相应jar包报的错误提示
- Angular JS中 Promise用法
- 理解Javascript中的变量作用域(scope)和语境(context)
- Extjs之自动消失提示框(Ext.example.msg)
- js file img 操作
- [js]关于闭包与访问数组下标的老生常谈
- Ajax跨域:jsonp还是CORS
- js将对象所有属性(都是数字,浮点小数),将其保留整数
- js求时间差