Java Wbe开发快速入门

1.servlet知识点小结

 

1.1. Servlet基础   

1) 什么是Servlet?    

容器: 装载Servlet所使用的服务器.

组件: 是用于处理用户(浏览器)所发送的请求.

      servlet就是组件.

2) 如何开发一个Servlet?    

1.创建一个class

2.继承HttpServlet类

3.覆盖service()方法
  ---选择参数HttpServletRequest与HttpServletResponse的方法

4.配置web.xml文件.

3) 什么是Servlet容器?  

   用于装载servlet的服务器就是Servlet容器.我们这里指的是tomcat服务
   .  

1.2. Servlet核心    

1.2.1. 核心的类与接口   

1) Servlet接口

2) GenericServlet抽象类 --- 实现init()方法以及destory()方法

3) HttpServlet抽象类

4) ServletRequest,ServletResponse接口

5) ServletConfig接口

a. ServletContext getServletContext();

b. String getInitParameter(String paraName);

6) HttpServletRequest接口---ServletRequest接口的子接口

a. String getParameter(String name);

b. String[] getParameterValues(String name);

c. setCharacterEncoding(String code);

d. RequestDispatcher getRequestDispatcher(String url);

e. setAttribute(String name,Object obj);

f. Object getAttribute(String name);

g. removeAttribute(String name);

h. String getContextPath();

i. String getRequestURI();

j. HttpSession getSession()/getSession(boolean flag);

k. Cookie[] getCookies();

7) HttpServletResponse接口 --- ServletResponse接口的子接口

a. setContentType(String str);

b. PrintWriter getWriter();

c. sendRedirect(String url);

d. encodeURL(String url); --- 作用于页面的URL重载

e. encodeRedirectURL(String url);  

            --- 作用于Servlet中的URL重载(只支持重定向)

f. addCookie(Cookie cookie);

8) ServletContext接口

a. String getRealPath(String str);  --- 获取该项目所在服务器的物理路径

b. setAttribute(String name,Object obj);

c. Object getAttribute(String name);

d. removeAttribute(String name);

e. String getInitParameter(String name);

1.2.2. servlet的生命周期   

1) 什么是servlet生命周期?

Servlet对象在服务器中被创建,被执行,被销毁的过程就是servlet的声明
   周期.

2) servlet生命周期的四个阶段?

   1. 当服务器启动时,servlet的class被装载.

   2. 当第一次请求到来的时候,servlet对象被创建(服务器调用其init())

   3. 在服务器销毁该对象之前,该对象一直处于保存状态.

   4. servlet对象被销毁,服务器调用的它的destory()方法.

<load-on-startup>配置

3) 如何override init方法?

init()或者init(ServletConfig config)

在方法中调用super.init()即可.

4) servlet的初始化参数如何配置?

<servlet>

<init-param>

<param-name>iphone</param-name>

<param-value>苹果手机</param-value>

</init-param>

</servlet>

1.2.3. 表单处理    

1) 如何读取表单中的参数

   request.getParameter(参数名);

   参数名与form表单中的控件的name属性一致.

   form表单中的控件必须存在name属性,否则该控件的内容

   将无法提交到服务器中.

2) 如何处理中文

   1. request.setCharacterEncoding(编码格式);
      设置request编码个是的方式只支持表单的post提交方式.

   2. URLEncoder与URLDecoder进行编码重组.

      首先使用URLEncoder将参数重新编码.

      在用URLDecoder重新编码的数据进行解码.

      第二种方式无论是post提交还是get提交方式都支持.但是当

      使用post方式进行提交的时候不能与request.setCharacterEncoding

      方法一起使用,否则会出现重复编码的问题,导致中文乱码.

      对于get方式没有影响.

1.2.4. get请求与post请求    

1) 哪一些是get请求,哪一些是post请求?

   GET:

   <a> 超链接的提交
   <form method=”get”> 表单的提交方式可以设置为get
   location.href 跳转的提交也是get方式

   POST:

   <form method=”post”> 表单提交方式为post时.

2) get请求不post请求的区别?
   1. get方式会将参数放在地址栏上不安全
      post方式是将参数放到数据包的实体中.

   2. get方式传递参数有限制,限制取决于地址栏可填写的内容大小
      post方式在理论上没有参数的个数限制.可以传无数个参数.
   3. get方式需要手动设置中文参数的编码方式.

      post方式是由服务器继续中文参数编码,只需设置编码格式即可.

1.2.5. 转发与重定向    

1) 什么是重定向?

   当服务器处理完客户端的请求后,会将一个地址以及302的状态码返回给浏览
   ,浏览器接到状态码和地址后会自动向该地址再次发送请求的过程.二次访
   问服务器是由浏览器自己完成的,不需要用户的操作.

2) 如何重定向?
   response.sendRedirect(请求地址)

3) 重定向的特点?
   1. 两次请求
   2. 地址栏会更变
   3. 因为是两次请求所以request对象和response对象不能通用.

4) 重定向编程需要注意的问题?

   1. 不能与PrintWriter对象一起使用.
      out对象的close()方法(out.flush())会将response对象中的内容清空

      一旦response对象的内容被清空,那么重定向会失效.

   2. 重定向可以跳转到所在服务器中的任何一个项目下.不局限于本项目中的

      请求或页面.

5) 什么是转发?

   当服务器对用户的请求进行处理时,在处理需要其他serlvet或页面支持的时
   候会将该请求与所需要的地址发送serlvet引擎中.在发送的过程中会携带一
   301的状态码.serlvet引擎在检测到301的状态码后,会将该请求转个目标
   地址.两个地址实际上处理的是同一个请求.

6) 如何转发?

request.getRequestDispatcher(转发地址).forword(requert, response);

7) 转发的特点?
   1. 一次请求
   2. 地址栏不会更变
   3. 两个处理请求的位置共用一个request对象和response对象.

8) 转发编程需要注意的问题?
   1. 与PrintWriter对象不兼容.(与重定向类似)

   2. 转发的位置只能与原位置处于同一个项目下.

9) 转发与重定向的区别
   1. 请求次数不同

   2. 地址栏的变更状态不同

   3. request对象与response对象的共用情况不同

   4. 访问位置限制不同.

2.状态管理(Cookie)

1) 什么是状态管理

   将客户端(一般是浏览器)与服务器之间的多次交互当作一个整体来看待,即
   将多次操作所涉及的数据记录下来。

2) 怎样进行状态管理

ü 第一种方式,cookie(在客户端管理用户的状态)

ü 第二种方式,session(在服务器端管理用户的状态)

3) cookie

浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式发送给服务器。通过这种方式,可以管理用户的状态。

2.1 创建cookie

Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);

浏览器访问服务器,激活服务器开始创建Cookie.

之后将创建好的Cookie绑定到Response对象中,然后再发送到

浏览器中.浏览器解析Response对象,将对象中的Cooike保存到

内存当中.

2.2 查找cookie

//如果没有cookie,则返回null。
Cookie[] cookies = request.getCookies();
String name = cookie.getName();
String value = cookie.getValue();

2.3 保存和查询Cookie流程

a. 浏览器向服务器发送addCookie请求

服务器中的AddCookieServlet创建了两个Cookie:cookie和cookie2

b. 服务器端执行语句response.addCookie(cookie);生成消息头“set-cookie”,

并将两个Cookie以键值对的方式(“name=aaa”、“passwd=123”)存放在消息头中发 送给浏览器

c. 浏览器将Cookie信息保存到本地内存中

d. 浏览器继续向服务器发送请求(带着消息头cookie)

服务器端的FindCookieServlet找到Cookie信息,并显示给浏览器

2.4 cookie保存时的编码问题

cookie的值只能是Ascii码字符,如果是中文,需要将中文转换成Ascii码字符形式。 可以使用URLEncoder.encode()方法和URLDecoder.decode()方法来进行这种转换。

2.5 Cookie的保存时间

计时单位是秒数.

cookie.setMaxAge(int seconds);
seconds > 0
浏览器会将cookie以文件的方式保存在硬盘上。在超过指定的时间以后,会删除该文件。
seconds < 0
默认值,浏览器会将cookie保存在内存里面。叧有当浏览器关闭之后,才会删除。

2.6 删除cookie

seconds = 0

立即删除该Cookie 

2.7 cookie的路径问题

浏览器在向服务器上的某个地址发送请求时, 会先比较cookie的路径与向访问的路径(地址)是否匹配,当有匹配的cookie,才会发送。 cookie的路径可以通过cookie.setPath(String path)方法来设置。 如果没有设置, 则有一个缺省的路径,缺省的路径是生成该cookie的组件的路径。 比如: /appname/addCookie保存了一个cookie, 则该cookie的路径就是/appname/addCookie。

2.8 Cookie的限制

cookie可以禁止

cookie的大小有限制(4k左右)

cookie的数量也有限制(浏览器大约能保存300个)

cookie的值只能是字符串,要考虑编码问题。

cookie不安全---用户能够随意更改

3.状态管理(session) 

浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id, 一般称 为sessionId)。服务器在缺省情况下,会将sessionId以cookie机制发送给浏览器。当 浏览器再次访问服务器时,会将sessionId发送给服务器。服务器依据sessionId就可以 找到对应的session对象。通过这种方式,就可以管理用户的状态。

3.1 如何获得session对象

方式一
HttpSession session = request.getSession(boolean flag);
flag = true: 服务器会先查看请求中是否包含sessionId, 如果没有,则创建一个session对象。 如果有,则依据sessionId去查找对应的session对象,如果找到,则返回。 如果找不到,则创建一个新的session对象。
flag = false: 服务器会先查看请求中是否包含sessionId, 如果没有,返回null。 如果有,则依据sessionId去查找对应的session对象,如果找到,则返回。 如果找不到,返回null。
方式二
HttpSession session = request.getSession();
与request.getSession(true)等价。

3.2 HttpSession接口提供的一些方法

//获得sessionId。
String session.getId();
//绑订数据
session.setAttribute(String name,Object obj);
/* obj最好实现Serializable接口
 * (服务器在对session进行持久化操作时,
 * 比如钝化、激活,会使用序列化协议)。
 */
Object session.getAttribute(String name);

//如果name对应的值不存在,返回null。
session.removeAttribute(String name);

3.3 session超时

服务器会将超过指定时间的session对象删除(在指定的时间内,该session对象没有使用)。
方式一: session.setMaxInactiveInterval(int seconds);
方式二: 服务器有一个缺省的超时限制,可以通过相应的配置文件来重新设置。 比如可以修改tomcat的web.xml(tomcat_home/conf下面)。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
另外,也可以修改某个应用的web.xml。

3.4 删除session

session.invalidate();

4. jstl与el表达式

4.1.1. jstl是什么?   

java standard taglib(java标准标签库)。

4.1.2. 标签是什么?   

sun公司制订的一种技术规范,用来将jsp页面中的java代码使用类似于html当中的标记来替换 的一种技术。这样做的目的,是为了使jsp页面更好维护以及更好的测试。

4.1.3. el表达式是什么?   

sun制订的一种用于计算的一种规则,早期只能用于给标签的属性赋值,现在也可以直接输出。

4.1.4. el表达式的基本语法    

${el表达式}

1) 第一种: 访问bean的属性

a. ${user.name}:

   <%=user.getName() %>

jsp引擎会依次从pageContext、request、session、application查找绑订名为"user" 的对象,如果找到了,就不再向下查找,否则,继续向下查找。 找到后,调用该对象的getName(),并输出其值;找不到,则输出""(空)。

b. 或者也可以使用${user["name"]},效果相同

"name" 表示字符串

c. 或者是${user[propname]},注意propname没有引号,表示变量

d. 此外,[ ]里面还可以是0,1..这样的下标,作用是输出数组里的元素值。

e. 可以使用pageScope,requestScope,sessionScope,applicationScope四个关键字指定查找的范围。

f. ${requestScope.user.name}只到request中去找,不再依次到4个范围查找了

2) 第二种: 获得请求参数值

a. ${param.username}

等价于 request.getParameter("username");

b. ${paramValues.interest}

等价于request.getParameterValues("interest");

3) 第三种: 计算一个表达式,将结果作为标签的属性值或者直接输出

a. 算术运算

"+" , "-" , "*" , "/" , "%" , 但是要注意,"+"号不能连接字符串。

b. 关系运算

"==" , "!=" , ">" , "<" ,">=" , "<="
可以使用对应的"eq","nq","lt","gt","le","ge"代替。

c. 逻辑运算

"&&","||","!",可以使用"and","or","not"代替。

d. empty运算

判断一个字符串是否为空,集合内容是否为空,以及绑订的对象是否存在。

${empty list} 如果list == null 或者 list.size() == 0 返回都为true

4.1.5. 核心标签的使用    

1) 使用步骤

需要将jstl标准标签库相关的jar文件copy到WEB-INF\lib。
D:\czh\MyEclipse 5.5.1 GA\eclipse
  \plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\ data\libraryset\JSTL1.1\lib\
   jstl.jar

standard.jar

2) 在jsp文件当中,使用taglib指令导入标签。

3) 使用标签

a. <c:if test="" var="" scope="">

ü test属性: 当值为true,执行标签体的内容,为false,则不执行。

ü var属性: 指定一个绑订名。

ü scope属性: 指定一个绑订范围。

   var属性和scope属性用于将test的结果绑订到指定的对象
   (pageContext,request,session,application)上。

b. <c:choose>

用于分支,当某个条件满足,执行某一个分支。每一个分支条件用when标签来表示。 <c:when test=""> 可出现多次,只用于<c:choose>

ü test属性: 当值为true,执行标签体的内容

<c:otherwise> 只出现1次,只用于<c:choose> 当其它分支都不满足条件,则执行该标签体的内容。

c. <c:forEach var="" items="" varStatus="">

用于遍历集合items属性:指定要遍历的集合。

ü var属性: 指定一个绑订名,jsp引擎会从集合当中取一个对象,绑订到 pageContext对象上。

ü varStatus属性: 指定一个绑订名,对应的绑订值是一个java对象,封装了遍 历时的一些信息,包括当前遍历的对象的下标(index)以及 是第几次(count)遍历。

d. <c:url>

当用户禁止cookie以后,会自动在地址后面添加sessionId。 当使用绝对路径时,会自动在地址前添加应用名。

ü value属性:指定地址。在表单提交、链接当中,可以使用该标签。

e. <c:set var="" scope="" value="">

绑订一个对象到指定的范围。

value属性: 绑订值。

f. <c:remove var="" scope="">

解除绑订

g. <c:catch var="">

处理异常,会将异常信息封装成一个对象,绑订到pageContext对象上。

h. <c:import url="">

url指定一个jsp文件的地址,jsp会在运行时调用这个jsp。

i. <c:redirect url="">

重定向到另外一个地址。url属性指定重定向的地址。

j. <c:out value="" default="" escapeXml="">

用于输出el表达式的值。

ü value属性: 指定输出的值

ü default属性: 指定缺省值。

ü escapeXml属性: 设置成true,会将value中的特殊字符替换成相应的实体。缺省值就是true。

5. 过滤器

1) 什么是过滤器

servlet规范当中定义的一种特殊的,用于对servlet容器的调用过程进行拦截。

1) 浏览器发送请求给服务器

2) 服务器的Servlet引擎创建Request对象&&Response对象

3) Servlet引擎先调用过滤器的doFilter方法,该方法有两个参数request和response,

(在过滤器中可以访问到Request对象&&Response对象)

4) 过滤器对拦截的内容进行处理

5) 之后调用SomeServlet的service方法

6) service方法执行

7) service方法执行结束后,将结果返回到过滤器

8) 过滤器将service方法返回的结果再次进行过滤

9) 最后,Servlet引擎将结果返回给浏览器

2) 怎样写一个过滤器

step1

写一个java类,实现一个Filter接口。

step2 doFilter方法里,实现过滤的逻辑。

step3 配置(web.xml)。

3) 配置初始化参数

step1 web.xml中,使用<init-param>元素来配置初始化参数

step2 Filter类中,使用FilterConfig.getInitParameter(String paraName);获得初始化参数。

4) 过滤器的优先级

当有多个过滤器都满足过滤的条件时,依据<filter-mapping>的先后顺序依次执行。

5) 过滤器的优点

a. 可以将多个web组件相同的逻辑写在一个过滤器当中,方便代码的维护

b. 可实现代码的“可插拔性"。

给一个软件增加或者减少某个功能不会影响已经存在的功能。

6. 监听器

1) 什么是监听器?

servlet规范当中定义的一种特殊的类,作用是监听容器当中产生的一些事件并进行相应的处理。 容器产生的事件指的是两大类事件:

第一大类

生命周期相关的事件,指的是当容器创建或者销毁
request,session,ServletContext对象时产生的事件。

第二大类

绑订事件,指的是当调用request,session,ServletContext对象的
setAttribute,removeAttribute时产生的事件。

2) 如何写监听器

step1 写一个java类,实现特定的监听器接口类(依据要监听的事件类型)。

step2 在接口声明的方法中,实现监听的逻辑。

step3 配置(web.xml)。

3) ServletContext接口

web服务器在启动时,会为每一个已经部署的应用创建唯一的一个
ServletContext实例。 该实例会一直存在,除非服务器关闭或者应用被删除。
注意:每个应用对应唯一的一个ServletContext实例

a. 如何获得ServletContext实例。

GenericServlet提供了getServletContext()方法。

HttpSession提供了getServletContext()方法。

ServletConfig提供了getServletContext()方法。

b. 常用方法

ü 绑订数据

setAttribute(String name,Object obj);

getAttribute(String name);

removeAttribute(String name);

ü 配置全局的初始化参数

step1 web.xml中,使用<context-param>配置的参数,可以被所有的
   servlet共享。

step2 使用String ServletContext.getInitParameter(String paraName);

ü 依据逻辑路径获得实际部署时的物理路径。

String ServletContext.getRealPath(String url);

猜你喜欢

转载自blog.csdn.net/qq_40016949/article/details/80234554