jsp/servlet基础知识

来源:互联网 发布:如何成为淘宝一件代发 编辑:程序博客网 时间:2024/06/06 01:13

不使用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中我们可以直接使用。

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修饰

0 0
原创粉丝点击