jsp、servlet笔记

1、init    初始化Jsp&Servlet方法    destroy 销毁Jsp&Servlet之前的方法    service 对用户请求生成响应的方法 2、Jsp文件必须在jsp服务器内运行    Jsp文件必须生成servlet执行    每个jsp页面的第一个访问者速度很慢,因为必须等待jsp编译为servlet    jsp页面的访问者无需安装任何客户端,甚至不需要java的运行环境,因为jsp页面输送到客户端的是标准的html页面 3、jsp注释:<%-- 注释内容 --%>    html注释:<!-- 注释内容 -->    jsp声明:<%! 声明部分 %>    jsp输出表达式:<%= jsp表达式 %> 4、通过jsp声明语法定义的变量和语法对应于servlet类里面的成员变量和方法,jsp脚本部分会转换为_jspService方法内的可执行代码,所以jsp脚本中不能定义方法,因为java不允许在方法内部定义方法 5、jsp三个编译指令:page 针对当前页面的指令 include 包含另一个页面(静态包含,会把被包含界面的编译指令也包含进来,但是动态的<jsp:include>不会) taglib 用于定义和访问自定义标签 6、jsp的七个动作指令:

<jsp:forward page="">
<jsp:param name="" value="">
</jsp:forward>  参数传递
<jsp:include> 动态包含(仅导入页面body内容)
<jsp:plugin> 用于下载javaBean或者Applet到客户端执行
<jsp:userBean> 创建javaBean实例
<jsp:setProperty> 设置javaBean实例的属性值
<jsp:getProperty> 输出javaBean实例的属性值

-------------------------------------------------------------------------------------------------------------- ps: 执行forward时,用户请求的url不会发生改变,转发时客户端的请求参数不会丢失,但页面内容完全被forward目标页内容  所取代。相当于用新页面来生成或处理用户请求,所以请求参数、属性的信息不会丢失。 ps:静态导入和动态导入的区别: 1、静态导入是完全融合,两个页面融合为一个servlet;而动态导入则在servlet中使用include方法来引入被导入页面的b ody内容; 2、静态导入时被导入页面的编译指令会起作用,动态导入不会; 3、动态包含可以追加额外参数; -------------------------------------------------------------------------------------------------------------- 7、jsp中的九个内置对象 application(让多个jsp、servlet共享数据)、config(可以获取servlet在web.xml文件中的配置参数——config.getInitParameter("paramName"))、exception、request、response、out(输出流对象,out.write(...)等价于<%= jsp表达式 %>)、session、page、pageContext ps:四个map结构:page、request、session、application 8、在web.xml文件中配置application(servletContext实例)级别变量——在jsp中通过application.getInitParameter("driver")访问: 配置application级别变量:

<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

配置servlet初始化参数:

<servlet>
<init-param>
<param-name>name</param-name>
<param-value>jack</param-value>
</init-param>
</servlet>

9、PageContext内置对象: 代表页面上下文,用于访问jsp之间的共享数据,使用PageContext可以访问page、request、session、application范围的变量 getAttribute(String name) setAttribute(String name,int scope),scope可以是如下四个值:PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE、PageContext.APPLICATION_SCOPE PageContext.getRequest、PageContext.getResponse、PageContext.getServletConfig、 PageContext.getServletContext、PageContext.getSession 10、request对象: 获取请求头、请求参数;操作request范围的属性; -------------------------------------------------------------- 执行forward或者include——代替jsp提供的forward或者include指令。 HttpServletRequest类提供了一个getRequestDiapatcher(String path)(Path必须以"/开始")方法, 其中path就是希望forward或include的目标路径,该方法返回RequestDispatcher对象。该对象提供以下两个方法:

-> forward(ServletRequest request,ServletResponse response); //forward到path下页面
-> include(ServletRequest request,ServletResponse response); //将path页面include到本页面

------------------------------------------------------------------ 11、response对象: 生成非字符响应(jsp的out对象属于JspWritter类,属于字符流的形式),对于字节流输出可以使用response 重定向:response.sendRedirect("") 增加cookie:

<%
String name = request.getParameter("name");
Cookie cookie = new Cookie("userName",name);
cookie.setMaxAge(24 * 3600);//设置cookie有效期为24h,如果不设置,则web应用关闭时cookie自动失效
response.addCookie(cookie);
%>
<%-- 获取本站保留的用户cookie --%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie c: cookies){             //遍历cookie查找输出
if(c.getName().equals("userName")){
out.println(c.getValue());
}
}
%>

如果cookie中出现中文字符,则必须使用java.net.URLEncoder进行编码,然后使用java.net.URLDecoder对其进行解码:

<%
//使用java.net.URLEncoder.encode进行编码
Cookie c = new Cookie("cnName",java.net.URLEncoder.encode("孙悟空"),"GBK");
cookie.setMaxAge(24 * 3600);//设置cookie有效期为24h,如果不设置,则web应用关闭时cookie自动失效
response.addCookie(cookie);

//获取cookie
Cookie[] cookies = request.getCookies();
for(Cookie c: cookies){             //遍历cookie查找输出
if(c.getName().equals("userName")){
//使用java.net.URLDecoder.decode进行解码
out.println(java.net.URLDecoder.decode(c.getValue()));
}
}
%>

12、session对象:主要用于跟踪用户会话信息,如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品。 session范围的属性可以是多个页面的跳转之间共享,主要有setAttribute(String attName,Object attValue)、 getAttribute(String attName)两个常用方法。 session机制通常用于保存客户端的状态信息,这些状态信息需要保存到web服务器的硬盘上,所以要求session里的属性值必须是可序列化的,否则会引发不可序列化的异常。session的属性值可以是任何可序列化的java对象。 13、servlet介绍 servlet通常是服务端小程序,运行在服务器端,用于处理及响应客户端请求。 servlet是个特殊的java类,这个类必须继承HttpServlet,servlet提供不同的方法来响应客户端请求: doGet、doPost、doPut、doDelete分别用于响应各自请求。一般只有doGet、doPost两种。 大部分时候,servlet对于所有请求的响应都是一样的,此时,可以重写service()方法即可响应客户端的所有响应。 另外HttpServlet包含另外两个方法: -> init(ServletConfig config) //创建servlet实例时,调用该方法初始化该servlet资源 -> destroy() //销毁servlet时,自动调用该方法回收资源 ps:普通servlet类里的service()方法的作用,完全等同于jsp生成servlet类的_jspService()方法。 14、servlet的配置 配置servlet有2种方式:

-> 在servlet类中使用@WebServlet Annotation配置
-> 在web.xml文件中配置
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>org.Class</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>aa</servlet-name>
<url-pattern>/aa</url-pattern>
</servlet-mapping>

15、servlet的生命周期(servlet的创建销毁等都是由web容器决定) ->创建servlet实例->init()->完成初始化->响应客户请求->destroy()->资源回收完成->实例被销毁 servlet创建有2个时机,用户请求之时、应用启动之时(通常用于某些后台服务的servlet,或者用于拦截请求的servlet) load-on-startup:

->它的值必须是一个整数,表示servlet应该被载入的顺序
->当值为0或者大于0时,表示在容器启动的时候就被加载并初始化
->当值小于0或者没有指定时,表示该servlet被选择调用的时候才会去加载
->正数的值越小,该servlet的优先级越高,应用启动就越先加载
->当值相同时,容器会自主选择相应servlet的加载顺序

16、Filter介绍 Filter可以认为是servlet的加强版,主要用于在request到达servlet之前进行预处理或者response到达客户端之前对response进行预处理操作。 Filter主要分类:

->日志Filter:只要用于记录用户每次的请求操作
->用户授权的Filter:负责检查用户请求,过滤非法请求
->负责解码的Filter:包括对非标准编码的请求解码
->XSTL:能改变xml内容的XSTL Filter
->一个Filter可以拦截多个用户请求,一个请求也可以被多个Filter拦截

创建Filter只需要: ->创建Filter类 ->在web.xml文件中配置filter 创建Filter必须实现的接口javax.servlet.Filter接口,该接口中定义了三个方法:

->init(FilterConfig config)  //在config对象中可以获取该filter的一些初始化参数,获取方法同servlet
->destory() //完成对filter销毁前资源的回收
->doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain)  //doFilter方法中的代码实际就是从多个servlet中的service()方法中抽调出来的通用代码,通过利用filter可以很好地实现代码复用。

17、Listener类 创建listener步骤: ->创建listener实现类 ->在web.xml文件中配置该listener 常见的web事件监听器接口有以下几种:

->ServletContextListener,用于监听web应用的启动关闭,
->ServletContextAttributeListener,用于监听ServletContext(application)范围内属性的改变
->ServletRequestListener,用于监听用户请求
->ServletRequestAttributeListener,用于监听ServletRequest(request)范围的属性的改变
->HttpSessionListener,用于监听session的开始和结束
->HttpSessionAttributeListener,用于监听HttpSession(session)范围内属性的改变

1)ServletContextListener

<context-param>
        <param-name>name</param-name>
        <param-value>value</param-value>
  </context-param>

->contextInitialized(ServletContextEvent sce),启动web应用时调用
->contextDestroyed(ServletContextEvent sce),关闭web应用时调用

配置Listener 在listener实现类上添加注解@WebListener即可,或者在web.xml根目录中配置:

<listener>
<!-- 指定该listener的实现类 -->
<listener-class></listener-class>
</listener>

ServletContextAttributeListener
->attributeAdded(ServletContextAttributeEvent event),将存入一个属性至application调用
->attributeRemoved(ServletContextAttributeEvent event),将一个属性从application范围中删除时调用
->attributeReplaced(ServletContextAttributeEvent event),将一个属性替换时调用

2)ServletRequestListener和ServletRequestAttributeListener

ServletRequestListener用于监听用户请求的到达,该接口的监听器需实现以下两个方法:
->requestInitialized(ServletRequestEvent event),用户请求到达、被初始化时调用
->requestDestroyed(ServletRequestEvent event),用户请求结束、被销毁时调用
ServletRequestAttributeListener用于监听request范围内属性的变化,该接口下方法如下:
->attributeAdded(ServletRequestAttributeEvent event)
->attributeRemoved(ServletRequestAttributeEvent event)
->attributeReplaced(ServletRequestAttributeEvent event)  //event.getName() or getValue()获取属性名、值

3)HttpSessionListener和HttpSessionAttributeListener

->sessionCreated(HttpSessionEvent event),用户与服务器的会话开始、创建时触发该方法
->sessionDestroyed(HttpSessionEvent event),用户服务器的会话断开、销毁时调用
HttpSessionAttributeListener用于监听session范围内属性的变化,该接口下方法如下:
->attributeAdded(ServletRequestAttributeEvent event)
->attributeRemoved(ServletRequestAttributeEvent event)
->attributeReplaced(ServletRequestAttributeEvent event)

18、表达式语言 ${expression} 在jsp页面中使用表达是语言可以直接获取请求参数值、获取javabean的指定属性值、获取请求头、获取各种范围属性值。 表达式语言内置11种:

->pageContext,同jsp内置对象中的PageContext对象
->pageScrope,用于获取page范围的属性值
->requestScrope,用于获取request范围的属性值
->sessionScrope,用于获取session范围属性值
->applicationScrope,用于获取application范围属性值
->param,用于获取请求的参数值
->paramValues,用于获取属性为数组的属性值
->header,用于获取请求头的属性值
->headerValues,用于获取请求头的属性值维数组的属性值
->initParam,用于获取web应用的初始化参数,即<context-param></context-param>中的值
->cookie,用于获取cookie值

19、servlet 3.0的文件上传 表单文件form.jsp:

<form method="post" action="upload" enctype="multipart/form-data">
文件名:<input type="text" id="name" name="name" /></br>
选择文件:<input type="file" id="file" name="file" />
<input type="submit" value="上传" />
</form>

UploadServlet如下:

@WebServlet(name="upload",urlPatterns={"/upload"})
@MultipartConfig   //该注解指定该servlet用于处理文件上传请求
public class UploadServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response) throws Exception{
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
//获取普通请求参数
String fileName = request.getParameter("name");
//获取上传文件域
Part part = request.getPart("file");
out.println("上传文件类型:"+ part.getContentType());
out.println("上传文件大小:"+ part.getSize());
//获取该文件上传域的Header Name
Collection<String> headerNames = part.getHeaderNames();
for(String headerName: headerNames){
out.println(headerName + "---" + part.getHeader(headerName));
}
//将上传的文件写入服务器uploadFiles文件夹下面
part.write(getServletContext().getRealPath("/uploadFiles") + "/" fileName);
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏钟绍威的专栏

初学File类

对File类的基本方法的理解 今天刚开始学了File类 一开始看思想编程看得迷迷糊糊的,之后受不了了,直接去看API文档 归纳: File->jav...

17510
来自专栏java系列博客

eclipse的一些小问题解决方案

2049
来自专栏大内老A

Model验证系统运行机制是如何实现的?

在前面三篇文章(《ModelValidator》、《ModelValidatorProvider》和《ModelValidatorProviders》)中我们详...

17810
来自专栏大内老A

了解ASP.NET MVC几种ActionResult的本质:FileResult

FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端。ASP.NET MVC...

17510
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十一天 JSP学习

JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,H...

923
来自专栏菩提树下的杨过

Silverlight Telerik控件学习:GridView双向绑定

做过WinForm数据库开发的人,一定有类似经历:DataGrid绑定后,如果允许行编辑,数据一顿修改后,想批量保存修改后的结果,通常是将DataGrid的所有...

2035
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(十四)— Mongoose介绍和入门

简介   Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具   那么要使用它,首先你得装上node.js和mongodb,...

3536
来自专栏爱撒谎的男孩

Mybatis之动态sql

3475
来自专栏阮一峰的网络日志

MIME笔记

MIME的全称是"Multipurpose Internet Mail Extensions",中译为"多用途互联网邮件扩展",指的是一系列的电子邮件技术规范,...

754
来自专栏Windows Community

Windows 商店应用中使用 SharePoint REST API

前面一篇我们介绍了 Office 365 REST API 的官方工具的使用,本篇我们来看一下 SharePoint REST API 本身的描述、结构和使用方...

38715

扫码关注云+社区