java-servlet

  • 参考:
  1. https://www.cnblogs.com/whgk/p/6399262.html
  2. https://www.cnblogs.com/xdp-gacl/p/3760336.html

 

  • 什么是Servlet
  1. Servlet是在服务器上运行的小程序,一个Servlet就是一个java类

 

  • Tomcat容器
  1. Engine引擎容器
  2. Host主机容器
  3. Context上下文容器
  4. Wrapper包装器
  • 这四个容器之间是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。
  • 在web项目中的一个Servlet类对应一个Wrapper,多个Servlet就对应多个Wrapper,当有多个Wrapper的时候就需要一个容器来管理这些Wrapper了,这就是Context容器了,Context容器对应一个工程,所以我们新部署一个工程到Tomcat中就会新创建一个Context容器。

 

  • 如何编写一个Servlet

 

  • Servlet体系结构
  1. Servlet接口
  2. GenericServlet抽象类
  3. HttpServlet抽象类
  4. 自定义Servlet
  • Servlet生命周期
  1. 初始化:调用init()方法(注:在这之前会先判断Servlet实例是否存在,如果不存在会先加载类并创建实例)
  2. 服务:调用service()方法
  3. 销毁:调用destroy()方法

  • Servlet的核心类有哪些?
// 1
ServletContext:容器,放置全局变量

setAtribute()

getAttribute()

// 2
ServletConfig:一个servlet的配置

getInitParameter(”名称”)

// 3
HttpServletRequest:封装的所有的请求

getParameterValue(”名称”)

getParameterValues(”称”)

getSession();

getAttribute(” 名称”);

getRequestDispatch(”a.jsp”).forward(request,response)

// 4
HttpServletResponse:响应

getOut();

sendRedirect(””)

//5
HttpSession:一个用户多个页面共享同一变量

setAttribute(””,””)
  • Servlet与JSP
  1. Servlet 通常使用字符串拼接的方式动态生成 html,大量的 html 内容使代码难以维护、可读性差。
  2. JSP 是基于 Servlet API 的,所以拥有 Servlet 拥有的一系列好处,可以实现各种功能,同时可以很方便地编写或修改网页,不用面对大量的 println 语句,但是,什么事情都要把握一个度,在 html 中混入大量、复杂的业务逻辑也是不可取的。
  3. 一种双剑合璧、扬长避短的方法是把 Servlet 当成 Controller 层,用于处理浏览器请求,并调用核心业务逻辑(Model)。而 JSP 则用作 View 层,负责动态地把处理结果输出到 html 中去。
  • Servlet的运行过程:
  1. Web服务器先检查Servlet实例是否存在,如果不存在则加载Servlet类并创建Servlet实例对象
  2. 调用Servlet实例对象的init()方法
  3. 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  4. WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
  • *.jsp 的执行过程:
  1. *.jsp 被转译为 *.java(该类继承自 HttpJspBase,而 HttpJspBase 继承自 HttpServlet)
  2. *.java 被编译成 *.class
  3. 执行 *.class,生成 html
  4. 通过 HTTP 协议把 html 响应返回给浏览器

 

  • 如何实现Servlet或JSP的单线程模式?
  1. 对于JSP,可以通过page指令进行设置:<%@page isThreadSafe=”false”%>
  2. 对于Servlet,可以让自定义的Servlet实现SingleThreadModel接口(标记接口,接口现已过时)。

    说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。

 

  • Servlet之ServletConfig对象、ServletContext对象、request对象、response对象 
  1. ​​​​​​​ServletConfig对象:
// 获取方式
getServletConfig(); 

// 功能
// getServletName();  //获取servlet的名称,也就是我们在web.xml中配置的servlet-name
// getServletContext(); //获取ServletContext对象
// getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
// getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值
  1. ServletContext对象 :
// 获取方式
getServletContext(); 

// 功能
// tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁
// 在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,
// 通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。
  1. request对象:
// request就是将请求文本封装而成的对象,所以通过request能获得请求文本中的所有内容,请求头、请求体、请求行 。

// 请求转发
// 特点:浏览器中url不会改变,也就是浏览器不知道服务器做了什么,是服务器帮我们跳转页面的,并且在转发后的页面,能够继续使用原先的request,因为是原先的request,所以request域中的属性都可以继续获取到。
request.getRequestDispatcher(String path).forward(request,response);
  1. response对象 :
// 重定向(页面跳转)

// 方式一:手动方案

response.setStatus(302);  //状态码302就代表重定向

response.setHeader("location","http://www.baidu.com");

// 方式二:使用封装好的方法
response.sendRedirect("http://www.baidu.com");

特点:服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。

// 注:response.sendRedirect(path)的用法;
// 第一种:使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
response.sendRedirect("/test01/MyServlet01");

// 第二种:没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。
response.sendRedirect("MyServlet01");

重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。就是这样来区别。

 

  • JSP之3个指令、6个动作、9个内置对象和4大作用域
  1. 参考:http://www.cnblogs.com/zhangyinhua/p/7637399.html
  • JSP九大内置对象
  1. ​​​​​​​Request:  request表示HttpServletRequest对象。取客户端表单域信息及cookie, header, 和session
  2. response: response表示HttpServletResponse对象,对客户端的响应返回文本、写cookies。
  3. out: out 向客户端打印html文本.
  4. pageContext :当前jsp页面的上下文环境,可以得到session、request、application等内置对象,在自定义标签中使用的很多。
  5. session: session表示一个请求的javax.servlet.http.HttpSession对象。Session一个用户多个页面共享同一变量。
  6. application: applicaton 表示一个javax.servle.ServletContext对象。存放容器级的变量。
  7. config: config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
  8. page: page表示从该页面产生的一个servlet实例
  9. exception:异常,当iserrorpage=true
  • JSP中动态include与静态include的区别?
<%-- 静态包含 --%>
<%@ include file="..." %>
 
<%-- 动态包含 --%>
<jsp:include page="...">
    <jsp:param name="..." value="..." />
</jsp:include>
// 静态 included
// 在将jsp生成servlet类前将两个文件和在一起,生成一个java类,一起运行的。所以是一家子,当中的变量名不能重名。
<%@ include file="included.htm" %>

// 动态 included
// 在运行时调用另一个页面,是两个类,是一个调用关系,在运行时动态的调用,不是一家子,可以重复变量。
// 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
<jsp:include page="included.jsp" flush="true" />

 

  • JSP页面中两种跳转方式分别是什么?有什么区别?
// forward跳转:
// 服务器端跳转,地址栏不改变。
// 执行到跳转语句后马上执行跳转,之后的代码不再执行(跳转之前一定要释放全部资源)。
// request设置的属性在跳转后的页面仍然可以使用。
<jsp:forward page ="跳转页面地址">


// response跳转:
// 客户端跳转,地址栏改变。
// 所有代码执行完毕后跳转。
// 跳转后页面不能使用上一个页面的request。
// 使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。
response.sendRedirect("跳转页面地址");

 

  • 在JSP中如何读取客户端的请求,如何确定某个Jsp文件的真实路径?
// 获取请求参数
Request.getparameter(“”)

// 获取某个jsp文件的路径
<%=application.getRealPath("aa.jsp") %>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值