servlet

服务器
1)让网页共享
2)让最终使用者能够访问service的java代码

如果使用java开发
服务器软件: tomcat

如果使用64位的操作系统 apache-tomcat-6.0.36-windows-x64.zip
如果使用32位的操作系统 apache-tomcat-6.0.36-windows-x86.zip

前提:必须在环境变量中设置JAVA_HOME
安装:解压软件到任意目录
/bin/startup.bat (启动服务器脚本)
/bin/shutdown.bat (关闭服务器脚本)
还可以直接关闭黑窗口来停止服务

tomcat默认要占用8080的端口号
如果被其他程序占用,会报 Socket bind(绑定端口时) failed :

/conf/server.xml
检查是否正常运行:
在浏览器上输入一个字符串 URL (同一资源定位符) 俗称网址

请求的协议 服务器的ip地址 端口号
http://localhost:8888 访问了服务器的主页面

服务器网页和程序的存储目录:webapps
ROOT 是tomcat中一个应用程序,它包含了主页面

如果要访问一个网页:
http://localhost:8888/ 等价于 http://localhost:8888/index.html
http://localhost:8888/index.html
http://localhost:8888/1.html

请求的协议 服务器的ip地址 端口号 / 应用程序名(对应磁盘上的目录名)
http://localhost:8888/my/2.html

如果不写端口号,默认端口号是80

底层原理: 【了解】
输入网址后,回车
1)向tomcat服务器发送了一个请求,请求的格式要符合http协议
GET /my/index.html HTTP/1.0
host: localhost

2)服务器接到请求
3)由服务器返回一个响应, 响应中包含了html内容
HTTP/1.1 200 OK (200表示成功,404表示访问的内容不存在,500表示服务器内部出现错误)
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"140-1430968391950"
Last-Modified: Thu, 07 May 2015 03:13:11 GMT
Content-Type: text/html
Content-Length: 140
Date: Thu, 07 May 2015 03:13:27 GMT
Connection: close

<!doctype html>
<html lang="en">
<head>
<meta charset="GBK">
<title>Document</title>
</head>
<body>
我的应用程序
</body>
</html>

HTTP协议: 向服务器发送请求,或是从服务器接收响应时要遵从的格式
特点:无状态
http:1.0中请求到达服务器,连接打开,响应返回后,连接就关闭
目的是为了能够让更多的用户同时访问服务器.
http:1.1中请求到达服务器,连接打开,响应返回后,连接不会马上断开
而是等待一段时间,如果在等待时间内没有请求,才会关闭连接
请求与请求之间是没有关联的。一次请求的内容无法被其他请求所共享

如何生成动态html内容
Servlet API (定义了一套接口)
HttpServlet
接收http请求
返回一个响应 (返回一个网页响应, 二进制响应..)

=============================== day 1 下午====================================
步骤1:
java 需要继承 HttpServlet
步骤2:
重写父类的方法:
/**
* HttpServletRequest 接口,代表请求
* HttpServletResponse 接口,代表响应
*/
public void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{

}

步骤3:
用response对象返回响应
1) response.setContentType(String 类型); // 设置响应的类型
text/html 表示文本的html响应
image/jpeg 表示返回jpeg 格式的图片
image/png 表示返回png格式的图片
...
2) response.setCharacterEncodeing(String 编码格式);
编码格式: utf-8, gbk ...

3) response.getWriter(); // 得到响应的字符输出流
response.getOutputStream(); // 得到响应的字节输出流

步骤4:(部署)
1) 部署目录
应用程序文件夹(my)
+ WEB-INF
+ lib (放置第三方jar包)
- ojdbc5.jar
+ classes (放置class 二进制文件)
包名
类名
- web.xml (配置servlet的访问路径)
- index.html

2) 配置web.xml文件

<servlet>
<servlet-name>名字</servlet-name>
<servlet-class>实际的包名.类名</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>名字</servlet-name>
<url-pattern>/路径</url-pattern>
</servlet-mapping>

http://ip地址:端口/应用名/url-pattern的地址


================================ day2 ===================================
典型问题:
1. 如果报了405错误,service方法名字写错, 或参数位置不对(没正确覆盖父类方法)
2. 404错误: 是由于没有找到要访问的资源(html, servlet)
3. 如果响应类型写错,如:
response.setContentType("test/html");
浏览器会把响应当作文件下载
4. 避免响应乱码:
1) <meta http-equiv='content-type' content='text/html;charset=utf-8'>
2) response.setContentType("text/html;charset=utf-8");
选择一种

===========================================================
1.用myeclipse简化servlet开发步骤
1. 建项目时需要用Web Project...
Context Root URL 指项目的名字
2. 要在myeclipse 中配置tomcat服务器
3. 用一个 按钮 deploy 部署应用程序
如果代码发生了修改,使用redeploy 按钮重新部署
或者
重新启动tomcat服务器,也可以让修改生效

2. 接收请求【重点】
HttpServletRequest request

.getRequestURI() 得到请求路径
/项目名/url-pattern的值

请求路径:
/项目名/url-pattern的值?请求参数名=请求参数值&参数名2=参数值2

.getQueryString() 得到?后的请求参数字符串

.getParameter(String 请求参数名) 返回请求参数值 【重点】

<!-- action 表示请求路径
method 提交方式 get 请求就是把请求参数跟在请求路径之后
post 会把请求参数隐藏起来-->
<form action="/servlet/request" method="post">
<!-- 传递请求参数的作用 username=实际填写的值 -->
<input type="text" name="username"/>
<input type="password" name="pass"/>
<!-- 提交表单: 把表单内的数据,变成请求参数,发送给服务器 -->
<input type="submit" value="提交"/>
</form>


.getParameterValues 它用来获取请求参数名一样,但值有多个的(复选框)

3. 请求参数的中文乱码
请求参数中不能有中文,如果有,浏览器会对参数做编码处理
服务器应当做响应的解码处理,否则就会有中文乱码

网页的字符集,要和解码使用的字符集一样,要么都是utf-8 要么都是gbk

解码:【重点】
// 对于get请求
String username = request.getParameter("username");
String result = new String(username.getBytes("iso-8859-1"), "utf-8");
// 对于post请求
在调用getParameter之前,先调用request.setCharacterEncoding("字符集");

建议:get请求中尽量避免请求参数中出现中文

================================== 作业 ============================
1. 实现登录例题,servlet,service, dao
2. FrontService
查询所有商品

servlet => 调用 查询所有商品方法 , 将所有商品信息显示为一张表格
image 图片列 ? => 显示为他对应的图片

=============================== day 3 ==================================
回顾:
1. servlet
运行在tomcat 服务器上的java代码
作用:处理浏览器发给服务器的请求,并把html内容作为响应返回给客户端

2. 如何开发一段servlet代码 【重点】
1) extends HttpServlet
2) service(HttpServletRequest, HttpServletResponse)
请求 响应
3) 处理请求
参数1=值1&参数2=值2

String 值 = request.getParameter("请求参数名");

get 请求 参数跟在请求地址之后, 参数字符串有长度限制
(获取)
直接在浏览器输入地址,或通过超链接点击一个地址
<a href="/my/hello"></a>

new String("值".getBytes("iso-8859-1"), 用来解码的字符集);
注意: 用来解码的字符集 要与网页的字符集一致

post 请求 没有跟着请求地址之后, 隐藏了, 没有长度限制
隐藏并不意味着安全, https协议(可以对传输的数据进行加密)
(发送)

request.setCharacterEncoding(解码的字符集);
request.getParameter();
4) 返回响应
response.setContentType("响应类型");
response.setCharacterEncoding("网页内容的编码字符集");
response.getWriter().println(html内容);
5) 请求转发
request.getRequestDispatcher("html网页地址")
.forward(request,response);
servlet不负责返回html内容了,而是转发到另一个网页,
返回的是这个网页的内容


3. 配置servlet
web.xml
<servlet>
<servlet-name>名</servlet-name>
<servlet-class>包.类名</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>名</servlet-name>
<url-pattern>/servlet路径</url-pattern>
</servlet-mapping>


=============================================================
1. jsp 网页
servlet 只负责处理请求和调用业务逻辑
把处理响应的职责交给 jsp来负责

<%@ 指令名 属性="值" %>

<%@ page pageEncoding="" contentType=""%>

pageEncoding=""
等价于
response.setCharacterEncoding();

contentType="text/html; charset=ISO-8859-1"
等价于
response.setContentType("text/html; charset=");


ISO-8859-1 英文字符集
GBK 简体中文
BIG5 繁体中文
UTF-8 中文 日文 韩文 ... (推荐使用)

2. 思想(分工协作):
servlet 只负责接受请求参数,调用业务逻辑
jsp 负责显示动态网页

servlet存值,jsp取值

中间通过请求转发结合:
request.getRequestDispatcher("/jsp路径").forward(request, response);

3. 存取值 【重点】
request.setAttribute("变量名", Object值); // 存


jsp页面里使用EL表达式

${ 表达式 }

从request中取:
1) requestScope.变量名
2) 如果变量是list集合 : requestScope.变量名[下标]
3) 如果变量是map集合 :
requestScope.变量名["key"]
requestScope.变量名.key

key 建议使用String 类型
value 可以是任意类型
4) 实体类对象
${ requestScope.变量名.属性名 }

这里的【属性名】
其实是以 get 或 is的方法名为准,不是那个私有属性名


4. 遍历list集合
jsp标签
导入一个标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

request.setAttribute("l", list); // "北京" "上海"
<c:forEach items="要遍历的集合" var="临时变量名">
${ pageScope.临时变量名 } , 还可以包含任意其他的html代码
</c:forEach>



<c:forEach items="${requestScope.l}" var="s">
${ pageScope.s }
</c:forEach>
对比===》
for(String s: list) {


}

5. 了解
以/开头的路径:绝对路径 格式: http://ip地址:端口号+绝对路径
没有以/开头的路径:相对路径 格式:
找到浏览器当前的网页地址(去掉最后一个/以后的部分) + 相对路径


推荐:绝对路径

===================================== day4 ================================================
1. 改写原来的登录程序
2. 要求在不同请求中显示用户名

============================================================================
1. Session (会话) 【重点】

同一个浏览器跟服务器之间发送的多次请求,可以称为一个会话

多次请求间需要共享的变量(比如说用户名),可以存储在会话当中

HttpSession 会话接口
String Object
.setAttribute("变量名", 值); // 向会话中保存变量
.getAttribute("变量名"); // 返回保存的变量 是Object类型
.removeAttribute("变量名"); // 删除保存的变量

需要手动调用代码来创建会话
HttpSession session = request.getSession();
// 创建会话 等价于request.getSession(true);
如果会话不存在,创建新的会话
如果会话已经存在,返回已有的会话

HttpSession session = request.getSession(boolean);
// true 表示总是创建会话
false 表示不创建会话 第一次 返回null
销毁session (把session占用的内存,以及存储的变量全部清空)
session.invalidate(); // 注销(安全退出)

关闭浏览器, 再重新打开意味着开始了一个新的会话,上一个会话存储的内容就访问不到了

【了解】
session有一个过期时间:如果两次请求的间隔超过了30分钟(默认值), session就自动销毁
可以在web.xml中设置:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
单位是分钟


==============================================================
2. el 表达式中的查找规则 【了解】
${变量名}
page对象.getAttribute("变量名");
request.getAttribute("变量名");
session.getAttribute("变量名");
application.getAttribute("变量名");

如果没有加前缀,依次查找四个对象,pageContext, request, session, application
谁先找到了,就用谁的变量


request.setAttribute("username","zhang");
session.setAttribute("username", "li");


${username} zhang
${sessionScope.username} li

setAttribute, getAttribute, removeAttribute 四种 Scope作用域

3. Cookie (小甜点) 【原理重点掌握】 【使用只需了解】
目的是为了在客户端浏览器和tomcat服务器之间建立一种联系

服务器生成cookie
Cookie c = new Cookie("名","值");
c.setMaxAge(int ); 单位秒 60 如果是大于0,表示cookie要存活多少秒
默认值是-1,表示浏览器一关闭,cookie就失效
=0 代表要删除此cookie
response.addCookie(Cookie); 如果名字或值中有中文必须编码
UrlEncoder.encode("原始值", "字符集")



服务器获取由浏览器发送的cookie?
Cookie[] 所有cookie = request.getCookies();

cookie大小 (名+值) 大约是 4k
浏览器能够存储每个服务器的 cookie的总数量 (20, 25, 50) 根据浏览器不同而不同

用途:
1) 几周内,一个月内不用输入用户名密码(记住密码功能)
2) 记住购物车内的商品 (注意cookie 不能跨浏览器存储)
3) 实现会话跟踪【重要原理】

request.getSession();
tomcat会给此session分配一个唯一id: FD3E3F40A0F36CA9BAF1BF5EA2D804F8

tomcat会在这次响应返回值创建一个cookie
Cookie c = new Cookie("JSESSIONID", "FD3E3F40A0F36CA9BAF1BF5EA2D804F8");
c.setMaxAge(0); // 浏览器一关闭,这个cookie就失效了


发送第二次请求时:
JSESSIONID=FD3E3F40A0F36CA9BAF1BF5EA2D804F8


session集合
id session对象
FD3E3F40A0F36CA9BAF1BF5EA2D804F8


=========================================== day 5 ========================================
1. 转发和包含

servlet -> request.getRequestDispatcher("路径").forward(request,response); -> jsp, (html, servlet)后两种很少见
servlet -> request.getRequestDispatcher("路径").include(request,response); -> jsp, servlet, (html)

jsp -> <jsp:include page="路径"/>

forward 转发 表示由下一个servlet或jsp返回响应
include 包含 表示本servlet或jsp结合下一个servlet或jsp返回响应

注意:
如果被包含的servlet里面执行了转发操作,不行的!! 出现 stream close 异常

2. servlet生命周期 (运行过程)
默认是第一次向这个servlet发请求时创建此servlet的实例

之后不论发送多少次请求,访问的都是同一个servlet

servlet中不建议添加成员变量,因为会有多线程并发访问问题
即使加了synchronized关键字也不好,会导致效率很低
service 类可以作为servlet的成员变量,是因为service实现类本身是线程安全

生命周期相关方法 【了解】
构造方法
init方法
destroy方法
service方法 多次调用
父类的service方法中:
String method = request.getMethed() => get, post
if(method.equals("GET")) {
doGet(request, response);
} else if(method.equals("POST")) {
doPost(request, response);
}

<!-- 表示此servlet会在服务器启动时被时被实例化和初始化 -->
<servlet>
...
<load-on-startup>数字,优先级(数字越小,优先级越高)</load-on-startup>
</servlet>

3. ServletContext 接口 【了解】
上下文
通常称为 application

application.setAttribute("变量名", Object 值); // 保存变量
Object 值 = application.getAttribute("变量名"); // 获取变量
application.removeAttribute("变量名"); // 删除变量

作用范围:整个应用程序
它的内部实现使用了线程安全的 map集合

4. 监听器 Listener 【了解】
比如说,实现在线人数统计: 本质上是统计session的数量

作用:
可以检测session何时被创建或销毁 HttpSessionListener
如果想检测应用程序启动和停止 ServletContextListener
可以检测request何时被创建或销毁
....

1) 针对不同需要,实现监听器接口
2) 实现监听器中的方法(一般是两个)
3) 配置 web.xml
<listener>
<listener-class>包.类名</listener-class>
</listener>

5. 重定向【重点】
目的也是servlet -》jsp 或 servlet -》servlet之间执行跳转
发送重定向
response.sendRedirect("/项目名/1.jsp");

转发
servlet -》jsp 或 servlet -》servlet之间执行跳转
request.getRequestDispatcher("/1.jsp").forward(request, response);

不同之处:
1)调用方法不同(request response)
2)路径的写法不同(相对路径,绝对路径)
3) 地址栏:forward 地址栏不会发生变化
redirect 地址栏会发生变化
4) 转发forward是一次请求
重定向是两次请求
5) 重定向的目标地址,不局限于本应用
response.sendRedirect("/项目2/1.jsp"); // 跳到项目2的页面
response.sendRedirect("http://www.baidu.com/"); // 跳转到另一个网站上
这时候session也没有用了


经验: 当你执行完增、删、改(没有需要显示的结果) => 重定向 查询逻辑servlet
servlet 只是执行查询,需要用jsp显示结果 => 转发

典型错误:
servlet和jsp之间存取值使用 request 作用域(错误的)
如果是使用重定向,那么servlet和jsp之间存取值必须使用 session作用域 (对)

===============================================================
tomcat 两种运行模式 【了解】
dubug (调试模式) 遇到断点停下来,并进入调试视图
run (正常模式) 遇到断点不会停

f8 继续运行
f6 单步执行
f5 进入方法

myeclipse-> window -> perferences -> java -> debug
suspend execution 第一个勾去掉 可以避免tomcat运行出异常是跳到debug视图

调试模式 当代码发生改动,很多情况下不需要重新部署,或重启服务,代码就会生效

出现:hot code replace failed 窗口,就必须重新部署,或重启服务, 改动才会生效


======================================================================
url-pattern 的写法
/开头

/hello
/day1/hello 合法
/hello.do 合法
/hello.action 合法
/* 合法 先进行精确匹配servlet,如果没有匹配的servlet会选择/* 的servlet
/*
jsp的优先级最低
/day1/* 合法 跟/*类似

*.do 合法
*.action 合法 优先级最低

/*.do 不合法
/day1/*.do 不合法


http://ip:端口/项目名/day1/hello

作业:

消费者要使用的功能
登录(已完成)
注册 待完成
注销(安全退出) 待完成
查询商品 (查询所有)
按价格、商品名、类别、 页号(每页商品数固定为3个) 进行查询 待完成
需要先查询所有类别,类别要显示为下拉列表
<input type="text" />
购物车 待完成

管理员要使用的功能
查询商品 待完成
修改商品 待完成
新增商品 待完成

查询类别 待完成
修改类别 待完成
新增类别 待完成
删除类别 待完成
登录
注销(安全退出)


==================================================================================
注意:对于jsp页面默认会在进入页面时调用 request.getSession() 会导致session被创建
如果不希望jsp页面主动创建session
<%@ page ... session="false" %>


=================================== day6 ========================================
1. 数据库连接池

DriverManager.getConnection(url, 用户名, 密码)

原因:1)如果对创建连接没有做限制,会拖垮数据库
2)数据库连接频繁打开和关闭,占用很多不必要的时间


需要对数据库连接上限做限制, 最好数据库连接不要频繁打开关闭


1)配置tomcat连接池 (dbcp 连接池) pool
找到tomcat文档:jdbc dataSource (它对应java中的连接池接口) 也叫数据源

tomcat安装目录/conf/context.xml, 进行如下配置:
<!-- resource 是配置数据源(连接池)
name = 名字 (可以出现/字符)
type="javax.sql.DataSource" 写死的,表示连接池使用的接口
driverClassName ="驱动类名"
url = "连接字符串"
username ="用户名"
password ="密码"
maxActive ="连接上限"
maxIdle ="空闲连接数" 指最少保持多少个空闲连接
maxWait ="没有空闲连接时的等待时间" -1 表示一直等待 (单位秒)
-->
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
username="hr" password="hr" maxActive="5" maxIdle="3"
maxWait="-1"/>

2) 将数据库 ojdbcxx.jar 放入tomcat安装目录/lib

3)通过java代码从连接池获取连接
Context // jndi (java命名和目录服务) 所有应用程序能够共享对象的一个作用域
// tomcat在启动时,会创建 DataSource对象并放入 Context

Context initContext = new InitialContext();
// lookup(" java:/comp/env" + resource中的name);
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/myoracle");

Connection conn = ds.getConnection(); // 从连接池中获取连接

conn.close(); // 没有真正关闭连接,仅仅是把连接还回连接池

4) 更新一下JdbcUtil工具类

包名全小写
类名每个单词首字母大写
变量名第一个单词首字母小写,其他单词首字母大写


2. 过滤器 【重点】
某些网页需要登录之后才能访问

怎么检查是否登录
在登录Servlet时向session中存储一个登录标记, 例如:
session.setAttribute("username", username);
其他servlet或jsp可以检查有没有这个登录标记,就能知道用户是否登录了

步骤:
1) java类要实现 Filter接口
2) 实现doFilter方法

3) 过滤器的配置
<filter>
<filter-name>checklogin</filter-name>
<filter-class>day6.CheckLoginFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>checklogin</filter-name>
<!-- 表示只要路径以/day6/开头,之后可以是任意的servlet或jsp -->
<url-pattern>/day6/*</url-pattern>
</filter-mapping>

4) 在doFilter方法内部,要把父类接口转为子类接口
5) 放行请求: chain.doFilter(request, response);
将请求交给下一个过滤器,如果没有下一个过滤器,请求就会到达目标地址

6) 如果有多个过滤器都匹配地址栏输入的路径,那么过滤器的执行顺序与配置先后顺序一致

应用:
1) 登录验证
2) request.setCharaterEncoding("");
<url-pattern>/*</url-pattern>
3) 过滤器可以对响应内容(html)做修改
gzip 压缩
tomcat已经提供了这个过滤器

=====================================================================================
1. 验证码 【扩展内容】
防止恶意重复注册用户
下订单等一些重要操作之前,让用户填写一个验证码,以确保填写表单的是一个人,而不是一段代码

2. 防止表单重复提交
token 令牌 【扩展内容】


========================================= day 7========================================
jsp 相关知识:
目的:用来返回一个html响应,可以配合 <c:forEach>, EL表达式生成动态内容

1. JSTL java standard(标准) tag (标签) library (库)
1)【重点】 <c:forEach items="${集合}" var="临时变量名"
begin="起始下标从0开始" end="结束下标" step="步长" varStatus="Status变量">
Status变量 有个count属性,用来实现计数功能

list, set, map, 数组


1) 生成一个99乘法表
2) 奇数行用红色显示,偶数行用蓝色显示

2)【重点】 <c:if test="条件">
里面的内容
<c:/if>
注意:没有else标签,必须通过一个条件完全相反的if标签来实现 else
<c:if test="!条件">

</c:if>
当条件为真,会输出if标签之间的内容,否则不会输出

el表达式中的逻辑运算符和比较运算符
取非 ! 或 not
或者 || 或 or
并且 && 或 and
判断相等 == 或 eq
大于 > 或 gt
小于 < 或 lt
大于等于 >= 或 ge
小于等于 <= 或 le
不等于 != 或 ne
empty 检查"非空"
null 属于空 , "" 属于空 集合.size()==0 属于空

3) 【了解】 <c:choose>
<c:when test="条件"></c:when>
<c:when test="条件"></c:when>
...
<c:otherwise></c:otherwise> 否则
</c:choose>

4) 【了解】其他标签:
格式化标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%>

函数标签:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
${ fn:函数名() }

length(字符串或集合或数组) 求长度


2. EL 表达式中的隐式对象
pageScope 当前页面作用域 map
requestScope 当前请求作用域 map
sessionScope 会话作用域 map
applicationScope 应用程序作用域 map

param 代表所有请求参数的map集合
key 请求参数名
value 请求参数值

cookie 代表所有cookie的map集合
key cookie名
value Cookie的对象
.getName()
.getValue() => value
.getMaxage()
pageContext 对象
.getRequest() => HttpServletRequest
request.getContextPath() 得到项目名
动态获取当前项目名,建议以后表单、超连接路径,写项目名时使用:
${pageContext.request.contextPath}

<c:set var="变量名" value="值" scope="page|request|session|application"/>
如果scope不写,默认值是page


=============================================================================
3. jsp 的工作原理【清楚】
jsp 就是一个servlet

转义 => *.jsp 代码 => *.java 代码
编译 => *.java 代码 => *.class

调用 jsp类中的 _jspService 方法来处理请求和响应

响应的主要功能是生成html内容,并写入输出字符流

但jsp内容发生修改,重新刷新页面,tomcat会重新执行转义、编译、包括调用_jspService

4. 早期jsp

4.1
生成动态内容 ===> 是使用java来生成
缺点: 可读性差,难以维护

1) jsp script(脚本)
<% 任意java代码 %>

2) jsp 指令【重点】
<%@ 指令 %>
page
tablib
include 指令
是将两个jsp的内容转义为一个servlet (静态包含)
<%@ include file="/day7/3.jsp" %>
只能包含jsp
include 动作
(动态包含)
两个jsp分别转义成两个不同的servlet, 把两个servlet生成的响应内容合并在一起
<jsp:include page="/day7/3.jsp"></jsp:include>
可以包含servlet和jsp

3) jsp 声明
<%! 定义变量,或定义方法 %>

4) jsp表达式
<%= 变量或表达式 %>

5) 动态内容的注释【重点】
<%-- --%> 对动态内容的注释 标签, el 表达式等... 能够防止动态内容执行
<!-- --> 对html静态内容的注释

用jsp script(脚本) 和jsp表达式 生成一个99乘法表

4.2 jsp动作
<jsp:forward>
request.getRequestDispatcher("...").forward(request,response);

<jsp:include page="要包含的路径可以是servlet或jsp">【重点】
request.getRequestDispatcher("...").include(request,response);


4.3
* 重定向的请求方式只能是get
* 重定向传参数
1) 借助session作用域, 重定向前存, 重定向后取
2) 把要传递的参数,拼在重定向的地址之后
servlet中:

String n = URLEncoder.encode("中文", "utf-8");
response.sendRedirect("/servlet/url-pattern?name=" + n);

jsp中:
<c:redirect url="/day7/2.jsp">
<c:param name="name">张三</c:param>
</c:redirect>

=========================================================================================
1.写出Servlet的生命周期的3个方法?
// 构造方法
init
service
destroy

2.假定myservlet应用 下有一个url-pattern为/abc的程序,分别写出请求转发(forward)
和重定向到该程序的代码,注意跳转过程中有一个name值需要传递。
request.setAttribute("name", 值);
request.getRequestDispatcher("/abc").forward(request, response);

// 方法1
request.getSession().setAttribute("name", 值);
response.sendRedirect("/myservlet/abc");

// 方法2
response.sendRedirect("/myservlet/abc?name="+值);
//中文要URLEncoder.decode(值, "字符集");

Scope
3.区分四个作用域,写出各自的特点

EL page Scope 只限于当前页面 pageContext.setAttribute , getAttribute , ...

EL requestScope 限于当前的请求 request.setAttribute...
EL sessionScope 同一个客户端浏览器的一次会话 session
EL applicationScope 同一个应用程序 application

Context context = new InitialContext(); 同一个服务器(tomcat) JNDI
context.lookup();

4.简述session的实现原理。
map集合
.setAttribute() getAttribute removeAttribute()
request.getSession()
session.invalidate()
会话跟踪原理
cookie tomcat => jsessionid 返回给客户端浏览器


5.定义并配置一个filter,将“/abc”程序的请求和响应的编码方式调整为UTF-8.

public class EncodingFilter implements Filter { // 1分

public void doFilter(ServletRequest req, ServletReponse resp, FilterChain chain) {// 1分

// 1分
HttpServletRequest request = (HttpServletRequest) req;
HttpServletReponse respnose = (HttpServletReponse) resp;

// 1分
// 请求
request.setCharacterEncoding("字符编码集"); // 解决post请求的中文乱码

// 1分
// 响应
response.setCharacterEncoding("字符编码集");

// 1分
chain.doFilter(request, response);
}
}

2 分
<filter>
<filter-name>encoding</filter-name>
<filter-class>EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/abc</url-pattern>
</filter-mapping>

============================================day 8==========================================
1. jsp 中的隐式对象
写在这两个标签之内
<%%>
<%=%>
因为这些对象在jsp脚本和jsp表达式中,都不需要声明,就可以使用,因此称为"隐式"对象

9大隐式对象
作用域(4个)
pageContext (页面作用域)
.setAttribute()
.getAttribute()
.removeAttribute()
.findAttribute()
=> 会依次查找page, request, session, application

request (HttpServletRequest)
session (HttpSession)
application (ServletContext)
跟响应相关(2个)
response (HttpServletResponse 响应对象)
out (JspWriter 响应的字符输出流)
其它
page this (jsp页面对应的java对象)
config (ServletConfig) servlet配置对象
它对应着<servlet>标签中的一段配置,
主要用来获取初始化参数的值
<servlet>
...
<init-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</init-param>
</servlet>

exception 当 <%@ page ... isErrorPage="true" %>
表示当前页面是一个错误页面


el 表达式隐式对象
${pageScope }
${requestScope }
${sessionScope }
${applicationScope }
${cookie }
${param }
${pageContext.request.contextPath } 获取项目名


=================================================================================================
1. 多条件组合查询
页面(条件表单) 查询结果
2. 购物车
购物车类




转载于:https://www.cnblogs.com/lovenannan/p/9711974.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值