JAVA WEB

5.JSP的9个内置对象

request

常用方法

  • getRequestDispatcher(String location) 转发。在同一个服务器资源完成资源跳转。
​
RequestDispatcher rd = request.getRequestDispatcher( "success.jsp") ;
 
rd.forward(request,response); 

​

response

  • sendRedirect(String location) 重定向。可以通过浏览器,重定向到某个 位置(当前服务器、外部的站点资源)
  • setCharacterEncoding(String str) 设置响应的编码格式 

session 

 代表一次会话。包含以下常用方法:

  • setAttribute(String key,Object value)(以key/value的形式保存对象值)
  • getAtrribute(String key)(通过key获取对象值) 
//设置一个对象到session范围内
session.setAttribute("usernam
e",username);
session.setAttribute("shopcar
t","购物车");
//从session范围内获取到某个对象
session.getAttribute("shopcar
t")
  • removeAttribute(String key) 
//从session范围内,删除一个对象
session.removeAttribute("shop
cart");
  • invalidate() 
//将所有的session全部设置失效!
session.invalidate();
  •  setMaxInactiveInterval(int value)
//设置session最大非活动时间,单位
是秒
session.setMaxInactiveInterva
l(3600);
  •  getMaxInactiveInterval
//获取到最大的session时长
<%=session.getMaxInactiveInte
rval()%>
  •  getId

        session的id名称为JSESSIONID,该id默 认情况下,是由cookie创建的。如果 cookie被禁用,那么就会通过容器创建一 个对应唯一性id,交给session,作为 sessionid。

转发与重定向的区别(面试题) 

转发:

  • URL地址是不变的。内部资源完成一个跳 转过程
  • 能够通过request实现带值跳转
  • 请求发起后,跳转到目标过程只发起一次 请求
  • 请求跳转速度又有是在站内,所以速度也 比较快。

重定向:

  • URL地址会发生改变。
  • 由浏览器发起两次 请求,第一次是请求的目标(30x),第二 次会有浏览器跳转到目标页面,该过程是 一个重定向的过程。
  • 不能够通过request实现带值跳转。
  • 由于两次跳转,所以速度相比较转发稍 慢。 

6.session消失的几种形式 

  •  客户端

        如果关闭了浏览器,此时再次打开浏览 器,可能会导致生成一个新的cookie,同 时生成新的sessionId,对于用户来讲, 相当于是一个新的用户。关闭浏览器之前 的session并没有消失,会保留在服务器 之中,直到过期位置! 

  • 服务器端:

         1.session超时,一段时间之内,客户没有 与浏览器做交互,此时的状态就是未交互 状态,当时长超过所设置的时间(tomcat 下默认30分钟),就会导致session过期。

        2.用户点击了注销按钮,此时的注销按钮调 用了session.invalidate()方法,导致当前 用户session注销。

        3. 服务器宕机或者是认为的关闭服务资源, 再或者是由于程序碰到了无法预知的严重 错误,导致session消失。

商城开发流程 

dao

  • 接口
  • Impl(实现类)

service

  • 接口
  • Impl(实现类)

Test

  • 测试类

web 

  •  controller(各个页面的控制)
  • 页面

用户登录密码加密

 采用MD5结合加盐的操作,实现密码的加密过程。 所使用的是来自于JAVA原生的类MessageDigist实现功 能。

 cookie

        cookies的作用主要是,当你访问了某些网页,并且对网页的一些设置进行修改,cookies就能跟踪并记录到这些修改,当你下一次访问这个网页的时候,这个网页会分析你电脑上的cookies,进而采取措施像你返回更符合你个性化的网页; 

7.Servlet

Servlet就是一个普通的JAVA类,但是能够处理http 的请求与响应过程 

 Servlet的基本架构

 Servlet的自身就是一个接口,同时还有一个 ServletConfig的接口。分别处理的不同事务。

  • Servlet接口
//当前的对象初始化 ***
void init(ServletConfig var1)
throws ServletException;

//获取到ServletConfig实例对象
ServletConfig
getServletConfig();

//服务的提供方法 *****
void service(ServletRequest
var1, ServletResponse var2) throws
ServletException, IOException;

//获取到Servlet信息
String getServletInfo();

//销毁服务 ***
void destroy();

  •  ServletConfig接口 

 该接口主要的功能就是实现配置加载

//获取到Servlet的名字
String getServletName();

//获取到Servlet的上下文
ServletContext
getServletContext();

//获取到Servlet配置中的初始化参数
String getInitParameter(String
var1);

//获取到Servlet配置中的所有的初始化
参数
Enumeration<String>
getInitParameterNames();
  • GenericServlet 

 该类虽然实现了Servlet接口,但是更多的是对 ServletConfig接口进行了实现,而把对应的Http 请求方法Service,扔给了其子类HttpServlet。

  • HttpServlet 

 该类主要就是完成用户的请求和响应。自定义的 Servlet必须继承该类!

//获取到请求方式
String method =
req.getMethod();
long lastModified;

根据不同的请求方式调用不同
doXXX()方法 

  •  自定义Servlet

 a.声明一个类,继承自HttpServlet

对象的创建

对象的初始化

提供服务

销毁

b.配置部署Servlet (在web.xml中,配置Servlet的信息)

步骤1:先配置Servlet的 位置

定义Servlet的名 字,供将来请求时能够找到该 Servlet

步骤2:配置什么样的请求 要找到哪一个对应Servlet

Servlet运行步骤:

1. 先去URL中找到对应的请求(urlpartten)

2. 找到请求所对应的Servlet的名字 (servlet-name) 以上两个部分都是在servletmapping中.

3. 根据名字找到Servlet配置节点中 的Servlet的名字(servlet-name)

4. 再确定Servlet的class所在位置 (servlet-class)

Servlet生命周期

  • 实例化Servlet 首先由客户端发起请求,容器会解析请求的 URL,找到对应Servlet配置中的"url-partten", 紧跟着继续查找对应“servlet-name”,找到了 “servlet-name”就会使用"servlet-class"实现类实 例化。
  • 调用init方法实现Servlet初始化 当容器执行自定义Servlet时,会自动调用init方 法,实现Servlet的初始化。 
  • 调用Service方法提供服务 在HttpServlet中的Service方法,会根据用户提 交的方式,选择调用doXXX方法,如果我们自己 重写了Service方法,而没有调用doXXX具体的方 法,可能在请求后,如果同时存在service以及对 应doXXX方法时,只会调用service这一个方法。
  • 调用destory方法实现销毁 当web容器销毁时,会调用每一个自定义Servlet 中的destory实现对Servlet的销毁功能。 

面试题: 

Servlet是一个单例设计的类,能够提高多线 程的访问能力。因此可能会存在线程安全性问题。

解决办法:尽量将变量放在方法里。

在Servlet中获取request、session、 application内置对象的方式 

//获取request,在调用doXX方法和service方法
时,会存在两个对应对象,其中一个就是request
doXXX(HttpServletRequest
request,HttpServletResponse response)
service(HttpServletRequest
request,HttpServletResponse repsonse)

//获取Session
HttpSession session =
request.getSession() ;

//获取Application
ServletContext application =
request.getServletContext() ;

 request的一些其他方法

  •  getContextPath(): 获取到当前项目的上下文路径
  • getMethod():获取到请求的方式
  • getHeader(String str):获取到请求的头信息的内 容

response的一些其他方法

//getWriter() :获取到PrintWriter对象,在内置对象中,代表out对象。

PrintWriter out =
response.getWriter() ;
out.println() ;

//setContentType(String txt):设置当前页面响应的内容形式。

response.setContentType("applicatio
n/json;charset=utf-8") ;
response.setContentType("img/jpeg")

文件上传 

 文件上传,它是将一个表单转换成一个二进制的数 据流提交,所以不能够使用request.getParameter形式 获取参数。因此需要将表单转换成二进制表单。

ps:

在表单中,添加一个enctype="multipart/form-data"设置。提交方式必须使用post形式。 

步骤:

  1. 创建FileItemFactory
  2. 创建ServletFileUpload用于对request进行解析
  3. 调用ServletFileUpload的方法设置编码格式
  4. 设置对request进行解析 ServletFileUpload.parseRequest
  5. 获取到所有的表单中的字段 FileItem
  6. 判断是否一个文件
  7. 将文件上传到对应的位 置
  • 文件上传的位置设 定
  • 真实目录的对象
  • 创建目录
  • 获取到文件的名字
  • 将文件名称一分为二,获取到 文件的扩展名
  • 新文件名名称创建
  • 实现文件的上传

FileItem对象的常用方法: 

  •  System.out.println(fileItem.getFieldName()); //获取表单中传输的name\
  • System.out.println(fileItem.getName()); //只 有是上传文件内容时,才能够获取到文件名称
  • System.out.println(fileItem.getSize()); //获取 到文件的大小
  • System.out.println(fileItem.getString()); //获 取当前FileItem对应的值
  • System.out.println(fileItem.getContentType()); //有是上传文件内容时,才能够获取到的文件类 型
  • System.out.println(fileItem.isFormField()); // 如果是普通字段,该值就是true,否则就是false

EL&JSTL

EL表达式

EL(Expression Language),表达式语言,是包含在 JAVA EE平台中的其中一种技术,主要的目的是为了能够 简化开发者在页面中的一些代码。特点是非常简洁,易 懂。

基本使用

  • 基本语法
 ${}
  •  [ ]和.的运算符

EL提供了.和[ ]两种运算符来存取数据

PS:

1.当要存取的属性名称中包含一些特殊字符,如.或?等并非是数字或字母的符号,就一定要使用[ ]。

2.如果要动态取值时。就要用[ ],而.无法办到。

   ${sessionScope.user[data]}//data 是一个变量
  • 包含的内容
通过变量名取值
${变量}
获取对象的属性值
${对象名.属性名}
获取集合元素
${对象名.size()} //调用方法
${对象名[索引]} //获取集合中索引的值
${map集合对象名["key"]} //获取到map
集合中的key所应的value
执行表达式
//算数运算
${ + - * / %}
/:可以使用div来替代
%:可以使用mod方式替代
//逻辑运算符
&&(and) ||(or) !(not)
//关系运算符
>(gt) <(lt) >=(ge) <=(le) !=(ne)
==(eq)
//empty运算符
empty:代表判断元素是否为null或者是是否
包含元素
not empty:代表代表判断元素是否不为null
或者是是否不包含元素
  •  获取作用域中的内容以及参数的内容和页面的内 容

 

  •  作用域的访问对象

正常情况下,在使用EL表达式时,需要在表达式 中添加对应的作用域,例如 ${sessionScope.xxx},如果我没有书写作用域访 问对象,此时,EL表达式就会从page向requet 中查询,如果request没有对应的值就会找到 session查询,session如果范围内也没有,就会 最后找到application,如果几个作用域都不包含 要查找的值或对象,就会返回null状态,假如途中找到了,就直接回传,不再继续找下去。此时如 果我们调用某个对象的某个属性或方法,此时EL 表达式如果没有找到对象就会直接输出空白

  •  参数访问对象

 param相当于是在页面中调用了 request.getParameter("")来获取参数中的内 容。 paramValues相当于在页面中调用了 request.getParameterValues("")来获取同名对 象的多个值,返回一个数组类型

  • JSP隐式对象 

 可以通过pageContext对象获取到该对象中的某 个值,同时还可以获取到页面中衍生出的各类内 置对象,例如可以通过 pageContext.request.contextPath获取到当前 项目的上下文路径。

  • 其他隐式对象
    cookie
    jstl中并没有提供设定cookie的动作
    要取得cookie中有一个设定名称为UserCounty的值,可以使用${cookie. UserCounty}来取得。
  • EL函数 
    语法:
    ns:function(arg1,arg2...argn)
    其中ns为前置名称,他必须和taglib指令的前置名称一致

JSTL

JSTL(Java Server Page Standard Tag Library),标 准标签库。是为了能够提高JAVA WEB开发的效率以及维 护性。

在JSTL中包括两种常用标签库内容:

  • 核心标签:核心标签库是整个JSTL中最常用的部 分,主要由以下几部分组成:基本输入输出、流 程控制、迭代操作和URL操作。负责Web应用的 常见工作,如:循环、表达式赋值、基本输入输 出等。
  • I18N格式标签库:用来格式化显示数据的工作 如:对不同区域的日期格式化等。

核心标签库

 步骤一:导入JSTL的依赖

步骤二:在使用该库的页面中添加指令

步骤三:使用标签库

<c:set var="变量名" value="值"  scope="request|session|application"/>
<c:set var="num" value="100" />
将一个对象中的属性进行修改
target:代表要修改的对象
property:要修改的对象中的属性
value:要修改的属性值
scope:指定var变量的范围
<c:set target="${userInfo}" property="username" value="zhangsan" />

步骤四:输出内容

<c:out value="${num}" />

 value:代表要输出的内容,如果直接 写了内容,就会按照普通输出的方式显示在 页面上 default:如果没有找到对应的变量, 就会采用default作为值输出 

  • 删除属性
<c:remove var="变量" />
  • 条件标签
<c:if test="条件表达式"></c:if>

 if表达式是没有else的相关操作的,如果需要 多层判断,则需要多谢一些if的语法

<c:if test="${empty userInfo}">
您还没有登录!
</c:if>
<c:if test="${not empty userInfo}">
您好,${userInfo.username}
</c:if>
<choose>
<c:when test="条件表达式">
//满足条件
</c:when>
...
<c:otherwise>
//多个条件都不满足,就会执行该段
语句
</c:otherwise>
</choose>
<c:choose>
<c:when test="${empty userInfo}">
您还没有登录!
</c:when>
<c:otherwise>
您好,
${userInfo.username}
</c:otherwise>
</c:choose>
  • 循环控制
<c:forEach var="循环时的变量" items="集合|数组" begin="起始值" end="结束值" step="迭代步长"varStatus="循环属性变量">
//循环体
</c:forEach>

//遍历集合
<c:forEach var="str" items="${strings}">
${str}
</c:forEach>
//按普通的值遍历
<c:forEach var="i" begin="0" end="10" step="1">
<a href="#">${i}</a>
</c:forEach>
//遍历map集合
<c:forEach var="m" items="${map}">
${m.key} --- ${m.value}
</c:forEach>
//获取varStatus中的变量内容
<c:forEach var="str" items="${strings}" varStatus="status"//显示循环状态的变量>
varStatus:显示循环状态的变量
index:从0开始
count:元素位置,从1开始
first:如果是第一个元素则显示true
last:如果是最后一个元素则显示true

<%--${status.index + 1} ${str}--%>
${status.last}
</c:forEach>
  • 格式化 

        数字格式化

<fmt:formatNumber value="12.34" pattern="#0.00" /> 12.34
保留小数点后两位数
<fmt:formatNumber value="12" type="currency" pattern="$.00"/> -- $12.00
<fmt:formatNumber value="12" type="currency" pattern="$.0#"/> -- $12.0
<fmt:formatNumber value="1234567890" type="currency"/> --$1,234,567,890.00(那个货币的符
号和当前web服务器的 local 设定有关)
<fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/> --123,456.79
<fmt:formatNumber value="123456.7" pattern="#,#00.0#"/> --123,456.7
<fmt:formatNumber value="123456.7" pattern="#,#00.00#"/> --123,456.70
<fmt:formatNumber value="12" type="percent" /> --1,200%type 可以是currency、number、 和percent。

        日期格式化 

1.<fmt:formatDate value="${date}" type="both"/>
输出格式: 2010-5-31 23:59:59
2.<fmt:formatDate value="${date}" type="date"/>
输出格式: 2010-4-1
3.<fmt:formatDate value="${date}" type="time"/>
输出格式: 23:59:59
4.<fmt:formatDate value="${date}" type="date" dateStyle="default"/>
输出格式:2010-5-31
5.<fmt:formatDate value="${date}" type="date" dateStyle="short"/>
输出格式:04-5-31
6.<fmt:formatDate value="${date}" type="date" dateStyle="medium"/>
输出格式:2010-5-31
7.<fmt:formatDate value="${date}" type="date" dateStyle="long"/>
输出格式: 2010年5月31日
8.<fmt:formatDate value="${date}" type="date" dateStyle="full"/>
输出格式:2010年5月31日 星期一
9.<fmt:formatDate value="${date}" type="time" timeStyle="default"/>
输出格式: 23:59:59
10.<fmt:formatDate value="${date}" type="time" timeStyle="short"/>
输出格式:下午11:59
11.<fmt:formatDate value="${date}" type="time" timeStyle="medium"/>
输出格式: 23:59:59
12.<fmt:formatDate value="${date}" type="time" timeStyle="long"/>
输出格式: 下午11时59分59秒
13.<fmt:formatDate value="${date}" type="time" timeStyle="full"/>
输出格式: 下午11时59分59秒 CDT
14.<fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy 输出格式: HH:mm:ss Z"/>星期四, 四月 1, 2010 13:30:00-0600
15.<fmt:formatDate value="${date}" type="both" pattern="d MMM yy, h:m:s a zzzz/>输出格式: 31 五月 04, 11:59:59下午 中央夏令时

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值