目录
Servlet基础
什么是Servlet
什么是Servlet
扩展Web服务器功能
组件规范
Servlet组件运行原理
开发一个Servlet
安装Tomcat
如何在Eclipse中关联Tomcat
如何删除关联
开发Servlet的步骤
常见错误及解决方式
404错误
容器如何找到service方法
405错误
500错误
Servlet 工作原理
Servlet获取请求参数
获取请求参数值的方法
getParameter方法
getParameterValues方法
请求方式
为什么区分请求方式
请求方式的种类
GET请求方式
POST请求方式
处理中文参数
表单提交中文乱码
解决POST方式时的乱码问题
解决GET方式时的乱码问题
Servlet输出中文
为什么返回的页面会有乱码
如何解决输出内容的乱码
Servlet访问数据库
使用JDBC技术访问数据库
Servlet运行过程
Servlet运行的详细步骤
路径处理
什么是重定向
重定向原理
如何重定向
重定向特点
重定向
处理请求资源路径
什么是请求资源路径
Web服务器对请求地址的处理过程
匹配Servlet规则
Servlet实现多请求
为什么要将多Servlet合并
使用后缀匹配模式修改web.xml
分析请求资源后分发
Servlet特性
Servlet生命周期
什么是Servlet生命周期
生命周期四阶段
servlet声明周期原理图
Servlet核心结构
Servlet接口
Servlet核心类
ServletContext
什么是Servlet上下文
如何获得Servlet上下文
Servlet上下文的作用及特点
Servlet线程安全问题
为什么会有线程安全问题
保证Servlet的线程安全
在Servlet使用Thymeleaf
结合servlet中使用
改写Servlet输出
结合Servlet使用注意事项
Thymeleaf代码封装
为什么需要封装
创建ThymeleafHelper
在Servlet中调用
状态管理
状态管理简介
为什么需要状态管理
什么是状态管理
状态管理的两种常见模式
Cookie
Cookie
什么是Cookie
Cookie的原理
如何创建Cookie
如何查询Cokie
如何修改Cookie
Cookie的生存时间
Cookie编码
Cookie解码
Cookie的路径问题
什么是Cookie的路径问题
发送Cookie的条件
设置Cookie的路径
Cookie的局限性
Session
Session
什么是Session(会话)
Session 工作原理
获得Session
使用Session绑定对象
删除Sesssion对象
Session验证
Session超时
什么是Session超时
修改Session的缺省时间
Cookie与Session
浏览器禁用Cookie的影响
什么是URL重写
实现URL重写
Session的优缺点
Servlet中有4大作用域对象
错题笔记
了解B/S,C/S架构
B/S的特点:客户端不需要单独的安装,开发相对简单。主要的业务逻辑是在服务端实现的。
C/S架构的特点:客户端需要安装专门的客户端软件
服务器就是一台高性能电脑,电脑上安装了提供服务的软件就称为 xxx服务器
servlet是Sun公司制定的一种来扩展web服务器功能的组件。
(在服务器处理http协议的组件)
注: web服务器通常只能处理静态资源的请求(html),
使用:servlet来扩展可以处理动态资源的请求,(访问数据库)
早期的时候是用CGI来扩展web服务器功能,由于它发繁琐,移植性不好,用的越来越少了。
什么是组件?
符合定的规范,实现部分功能,并且需要部署到相应的容器里才能运行的软件模块。
什么是容器?
符合一定的规范, 提供组件的运行环境。
举例:
1. 邮件服务器: 就是在电脑上安装了提供邮件收发服务的软件
2. ftp服务器: 就是在电脑上安装了提供文件上传下载服务的软件
3. 数据库服务器: 在电脑上安装了提供数据增删改查服务的软件(MySQL/Oracle...)
4. web服务器: 就是在电脑上安装了web服务软件(Webserver)
Web服务软件做了那些事儿
1. 负责建立底层的网络连接
2. 负责将客户端请求的文件返回给客户端
3. web服务器又称为web容器, web容器是用来装组件(Servlet),Web服务软件通过解析请求地址找到对应的Servlet作出响应
Sun ( Oracle )公司制定的-种用来扩展Web服务器功能的组件规范.
Servlet是用于扩展Web服务软件业务功能的组件,每一种业务都对应一个单独的Servlet
组件:在软件开发行业,符合一定规范,实现部分功能,并且需要部署到容器当中才能运行的软件模块
容器:符合一定规范 ,提供组件运行环境的一个程序
1. 下载Tomcat安装文件: 从苍老师文档服务器, 找到常用下载->Java->Tomcat 8.4.45 解压到一个指定的目录(路径中不要有中文,可以在D盘直接创建java文件夹把下载的文件复制过去)
2. eclipse中window->最后一个->Server->Runtime
如果里面有内容删除, 点击add->找到8.5(没有8.5的同学从文档服务器下载新的eclipse,下载完后记得要配置maven) ->点击Browser->找到第一步解压的文件夹->Finish
3. 找到servers面板(如果找不到 window->show View里面找,还是找不到other里面搜),在servers面板中点击超链接添加对应版本的Tomcat, 添加完之后双击修改单选到中间位置(这一步是修改部署工程的路径 作用后面会讲)
4. 在servers里面Tomcat上右键start启动Tomcat,在控制台输出以下内容后,在浏览器中访问localhost:8080 显示出猫说明搞定
Server startup in 580 ms
1. 在servers面板中删除添加的Tomcat
2. eclipse中window->最后一个->Server->Runtime 找到添加的Tomcat删除
3. 把解压的Tomcat安装文件夹删除,重新解压
package cn.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet");
//设置响应类型
resp.setContentType("text/html;charset=utf-8");
//获取输出对象
PrintWriter pw = resp.getWriter();
//输出数据
pw.print("你好Servlet");
//关闭资源
pw.close();
}
}
创建Web工程
1. 创建maven工程 把jar改war
2. 改错: 在最长的文件名上面右键点击最长的一个, 此过程是创建了web.xml配置文件,该配置文件中保存着请求路径和Servlet的对应关系
3. 让创建的工程和Tomcat关联, 在工程名上右键->Properties->Targeted runtimes 在里面的Tomcat后面打钩 保存关闭即可
4. 创建Servlet, 包名cn.tedu 类名HelloServlet 删除类里面的注释和代码
5. 重写service方法 ,删除方法中的内容,控制台输出HelloServlet
6. 在工程名上面右键Run as->Run on Server
7. 浏览器中访问http://localhost:8080/servlet_1_1/HelloServlet,显示空白,控制台输出HelloServlet说明OK.
404数字是什么?
解决方式
404控制台并且显示ClassNotFound
解决方案: 检查web.xml中的完整类名和创建的类名是否一致,检查请求的路径和配置文件中的路径 是否一致,如果以上全都一致,Clean工程:1. 在eclipse中Project里面找到clean 2. Servers面板中先 停止Tomcat,展开Tomcat 删除当前的工程 或者在Tomcat上右键Clean
如:
解决方式
解决方式
获取提交的1 : 1的Name-Value的方法
--getParameter(name)
获取提交的1 : M的Name- Values的方法
--getParameterValues(name)
package cn.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SayHelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数
String info = request.getParameter("info");
//设置响应类型
response.setContentType("text/html;charset=utf-8");
//获取输出对象
PrintWriter pw = response.getWriter();
//输出数据
pw.print(info+"您好!");
//关闭资源
pw.close();
}
}
请求方式是客户端对话服务器时的意向说明,是区分请求种类的关键。
不同的请求方式不仅仅在数据传输时会有所不同,在表单提交及服务器端处理时都会采用不同的方式,而区分不同种类的请求方式也会使得浏览器采用不同的缓存方式处理后续请求,从而提升响应速度。
客户端发出请求的几种方式
1. 在浏览器的地址栏中写请求路径 回车后发出请求 get
2. 在页面中通过超链接发出请求 get
3. 在页面中通过form表单发出请求 get/post
GET: 请求参数放在请求地址的后面,请求参数有大小限制 只能传递几k的数据,而且参数在地址栏中可以看到 所以不能传递敏感信息(密码)
Post:请求参数放在请求体里面用户看不到,而且没有大小限制 通常上传文件时或者传递敏感信息时使用POST
创建的Servlet需要改名的话,切记把web.xml中的一起改掉不然报错
修改Servlet或页面里面的代码不需要重新运行工程,新增了Servlet后因为web.XML文件修改了 所以需要重新运行工程
当表单提交时,浏览器会对中文参数值进行编码(会使用打开表单所在的页面时的字符集进行编码)。Web服务器在默认情况下会使用iso- 8859-1去解码
- post请求参数有中文时每次获取参数之前执行以下代码
request.setCharacterEncoding("UTF-8");
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Post方法");
//获取传递过来的参数
//Post 请求获取参数时 如果有中文 必须 每次添加以下代码
request.setCharacterEncoding("UTF-8");
String info =request.getParameter("info");
System.out.println(info);
}
get请求获取参数时中文乱码问题
Tomcat8.0以下版本才会有此问题, 找到Servers工程中的server.xml里面的65行 添加以下URIEncoding="UTF-8"属性
BMI练习 - BMI身体质量指数 = 体重(kg)/身高(m)的平方 70/(1.8*1.8) - 18.5以下 体重偏轻 18.5-24之间正常体重 24-28之间偏重 大于28肥胖 - 步骤: 1. 创建bmi.html页面 页面中添加form表单,提交地址BMIServlet,两个文本输入框(name分别为h和w) 和一个提交按钮 2. 创建BMIServlet 留下doGet方法获取传递过来的身高体重,转成double类型按照上面的公式进行计算得到bmi的值,判断bmi的值是在哪个范围来决定给页面返回什么数据 服务器向浏览器发送一个302状态码及一个L ocation消息头(该消 1.访问AddEmp 使用响应对象的AP I方法即可实现重定向的过程,在Servlet中编写如下代码 - 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 - 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求- 在浏览器地址栏中输入的地址格式如下: 精确匹配 通配符匹配 后缀匹配 无匹配 容器如何创建Servlet对象、 如何为Servlet对象分配资源、 如何调用Servlet对象的方法来处理请求、 以及如何销毁Servlet对象的整个过程. 阶段一:实例化。 Servlet的初始化参数配置如下,在web . xm1文件中的 读取Servlet的初始化参数如下,在Servlet中 阶段三:就绪 阶段四:销毁 Servlet接1 容器启动之后,会为每一个Web应用创建唯一 的一 个符合ServletContext接[要求的对象,该对象就是servlet.上下文。 方式一 作用一 //创建一个名为ThymeleafHe lper的类代码如下 Servlet API为使用Cookie提供了javax.servlet.http.Cookie 获取客户端的所有Cookie对象: 同名Cookie会覆盖,以达到修改的目的 Cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。 编码后的Cookie为了看到实际的中文,需要还原后再显示 使用如下代码段可以设置Cookie的路径 浏览器访问Web服务器时,服务器会为每个浏览器在服务器端的内存中分配空间,单独创建一个Session对象 ,该对象有一个Id属性 注: getAttribute方法的返回值是Object类型,在去除数据时要对其进行数据类型转换,且必须与我们存入的数据类型一-致 立即删除Session对象: 如果浏览器禁用Cookie,Session还能用吗? 浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即,在原来的地址后面加上了SessionId) 如果是链接地址和表单提交,使用 分别是: HttpServletRequest, HttpSession, ServletContext. PageContext, protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Get方法");
//获取传递过来的参数
String info = request.getParameter("info");
System.out.println(info);
}
Servlet输出中文
为什么返回的页面会有乱码
如何解决输出内容的乱码
Servlet访问数据库
使用JDBC技术访问数据库
Servlet运行过程
Servlet运行的详细步骤
package cn.tedu;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BMIServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数
String hStr = request.getParameter("h");
String wStr = request.getParameter("w");
//把字符串类型转成浮点数
double h = Double.parseDouble(hStr);
double w = Double.parseDouble(wStr);
//计算bmi bmi=体重/身高的平方
double bmi = w/(h*h);
// 18.5 24 28
String info = null;
if(bmi<18.5) {
info = "兄弟你瘦了";
}else if(bmi>=18.5&&bmi<24) {
info = "恭喜你!体重正常 继续保持";
}else if(bmi>=24&&bmi<28) {
info = "哥们儿可以少吃点儿了";
}else {
info = "肥胖!!!!!";
}
//设置响应类型
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(info+bmi);
pw.close();
}
}
路径处理
什么是重定向
息头的值是一个地址 ,称之为重定向地址), 浏览器收到后会立即
向重定向地址发出请求
重定向原理
2.执行数据插入操作
3.执行结束后使用重定向代码发回一个数据包,里面包括302状态码和一个消息头Location
4.浏览器收到后会立即向服务器的istEmp发出请求
3 ,4过程就是重定向
如何重定向
response . sendRedirect("url");
该段代码使得响应数据包中数据发生如下变化:HTTP /1.1 302 Moved Temporarily
Server : Apache-Coyote / 1.1
Location : http://localhost : 8080/ appName/url
Content-Type : text/html ; charset = utf-8
Content-Length : 0
Date : Sat, 03 Jan 2013 08:15: 24 GMT
重定向特点
重定向
response.sendRedirect( request.getContextPath()+"/ListServlet");
处理请求资源路径
什么是请求资源路径
Web服务器对请求地址的处理过程
匹配Servlet规则
Servlet实现多请求为什么要将多Servlet合并
使用后缀匹配模式修改web.xml
分析请求资源后分发
Servlet特性
Servlet生命周期
什么是Servlet生命周期
生命周期四阶段
阶段二:初始化
String V= getInitParameter(" company" )
容器收到请求之后调用Servlet对象的service ( )来处理请求。
servlet声明周期原理图
Servlet核心结构
GenericServlet抽象类
HttpServlet抽象类
核心结构图
Servlet接口
Servlet核心类
ServletContext什么是Servlet上下文
特点
如何获得Servlet上下文
通过GenericServlet提供的getServlet ontext ( )
方式二
通过ServletConfig提供的getServletContext ( )
方式三
通过HttpSession提供的getServletContext ( )
方式四
通过FilterConfig提供的getServletContext ( )
Servlet上下文的作用及特点
使用setAttribute绑定数据
作用二
使用removeAttribute移除绑定数据
作用三
使用getAttribute获取绑定数据
特点
servlet上下文绑定的数据可以被整个应用上的所有组件共享,并且一直可以访问
Servlet线程安全问题
为什么会有线程安全问题
保证Servlet的线程安全
//使用synchronized对代码加锁即可
synchronized( this ){
count ++ ;
try {
}catch(
){
..
}
System . out . println( count);
}
在Servlet使用Thymeleaf
结合servlet中使用改写Servlet输出
//Servlet类中doPost或doGet方法中编写代码
TemplateEngine templateEngine=new TemplateEngine();
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver( );
resolver . setCharacterEncoding("utf-8");
templateEngine . setTemplateResolver(resolver);
Context ctx=new Context();
ctx. setVariable("msg" ,"He1lo World!!!");
//套用模板弓|擎,返回字符串
string result = templateEngine . process(" ../index. html", ctx);
/ /设置响应头
response. setContentType ( "text/htm1 ; charset=utf-8");
/ /获得响应输出流
Printwriter writer = response . getWriter();
//输出页面结果
writer .write( result);
writer . close();
结合Servlet使用注意事项
Thymeleaf代码封装
package cn.tedu.utils;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
public class THUtils {
private static TemplateEngine te;
static {
ClassLoaderTemplateResolver r = new ClassLoaderTemplateResolver();
// 设置字符集
r.setCharacterEncoding("UTF-8");
// 创建模板引擎对象
te = new TemplateEngine();
// 引擎对象和解析关联
te.setTemplateResolver(r);
}
public static void write(String fileName,
Context context,HttpServletResponse response
) throws IOException {
//将模板页面和Context 容器中的数据整合得到一个新的html
String html = te.process(fileName, context);
//把得到的html 返回给浏览器2
response.setContentType("text/html;charset=utf-8");
PrintWriter pw= response.getWriter();
pw.print(html);
pw.close();
}
}
为什么需要封装
创建ThymeleafHelper
//Thymeleaf的模板引擎
private static TemplateEngine templateEngine;
static{
//初始化Thymeleaf的模板引擎
templateEngine=new TemplateEngine();
ClassLoaderTemplateResolver resolver = new
ClassLoaderTemplateResolver( );
resolver . setPrefix("../");//设置路径前缀
resolver . setsuffix(" . html");/ /设置路径后缀
resolver . setCharacterEncoding ("utf- 8");
templateEngine . setTemplateResolver( resolver);
}
public static void ThymeleafWrite(String
path , HttpServletResponse response) throws IOException{
//套用模板引擎,返回字符串
String result = templateEngine . process(path, new Context());
//设置响应头
response . setContent Type ( " text/htm1 ; charset=utf-8");
//获得响应输出流
PrintWriter writer = response . getwriter();
//输出页面结果
writer . write(result);
writer . close();
}
在Servlet中调用 JDao dao = new JDao();
List
状态管理
状态管理简介
为什么需要状态管理
什么是状态管理
状态管理的两种常见模式
Cookie
Cookie什么是Cookie
Cookie的原理
如何创建Cookie
name:用于区分不同Cookie的名字
value : Cookie的值//创建Cookie ,代码如下
//创建Cookie对象
Cookie c = new Cookie(String name ,String value);
//添加Cookie对象
response . addCookie( c ) ;
如何查询Cokie
Cookie[ ]request .getCookies( );
-注:该方法有可能返回null
获取一个Cookie对象的名称或值:
一String Cookie . getName ( ) ;
一String Cookie . getValue ( ) ;
如何修改Cookie
Cookie[] Cookies = request . getCookies();
if(Cookies != null ){
for(Cookie C : Cookies){
String name = C. getName( ) ;
if(name . equals(“city"){
C. setValue("ShangHai");
response . addCookie( C );
}
}
}
Cookie的生存时间
Cookie编码Cookie解码
//代码如下 -->与编码时格式保持一致
Cookie[ ] Cookies = request. getCookies( );
if(Cookies != nul1){
Cookie C = Cookies[ 0 ] ;
String value = C. getValue( );
value = URLDecoder . decode(value,"utf-8");
}
Cookie的路径问题
什么是Cookie的路径问题
发送Cookie的条件
设置Cookie的路径
Cookie c = new Cookie( "uname" , "Jack" );
C. setpath("/appName" );
response . addCookie(c);
Cookie的局限性
Session
Session什么是Session(会话)
其值唯一, 一 般称之为SessionId ,并且服务器会将这个SessionId (使用Cookie的方式)发送给浏览器;浏览器再次访问服务器时,会将SessionId发送给服务器,服务器可以依据SessionId找到对应的Session对象
Session 工作原理
获得Session
使用Session绑定对象
删除Sesssion对象
Session.invalidate( );
Session验证
Session超时什么是Session超时
修改Session的缺省时间
Cookie与Session浏览器禁用Cookie的影响
答案:不能,但有其他的解决方案,服务器在默认情况下,会使用Cookie的方式将SessionId发送给浏览器,如果用户禁止Cookie ,则SessionId不会被浏览器保存, 此时,服务器可以使用如URL重写这样的方式来发送SessionId
什么是URL重写
实现URL重写
response.encodeUR ( String url )生成重写后的URL
如果是重定向,使用
response.encodeRedirectURL (String url) ;生成重写后的URL
Session的优缺点
Servlet中有4大作用域对象
错题笔记