引言:目前html+tomcat,在网络中访问浏览器页面
问题:html+tomcat导致用户浏览页面内容不变
解决问题:servlet
什么是servlet?概念:servlet是一段java代码,用户可以通过网络请求访问到这段java代码,每访问一次这段java代码执行一次
可以根据用户访问时间的不同,来让java代码执行的结果变得不同
语法:javaEE(企业版)servlet(Servlet-api.jar)
1.servlet接口
interface Servlet{ //当一个实现Servlet接口的类创建对象时被调用 protected void init(); //对象被销毁时调用 protected void destory(); //对象被网络访问的时候调用 protected void service(); }
2.javaEE已经实现的Servlet接口,HttpServlet
3.我们自定义servlet时继承了HttpServlet,重写service()方法即可
class MyServlet extends HttpServlet{ service(){ //自定义service的方法和内容 } //不需要再重新写init和destory方法 }
3.问题将servlet部署到tomcat
答案:servlet.java servlet.class
问题:保存在哪?
4.web.xml
作用:给自定义servlet取网络协议名(url-pattern)
在web.xml中注册servlet
tomcat中的存放位置:WEB-INF下
servlet的执行流程
执行流程含义:当浏览器发送了一个请求,中间发生了什么,最终导致servlet被执行
乱码问题
练习
查询person‘表,并且将表中的内容以表格的形式展示
编码步骤:
1.建表
2.建项目, JDBCUtil.java ,JDBCUtil.properties, jar包(ojdbc6.jar,servlet-api.jar)
3.建实体类 com.baizhi.entity
4.建Dao接口 com.baizhi.dao
5.建Dao的实现类 com.baizhi.dao.impl
6.测试dao com.baizhi.test
7.建service接口 com.baizhi.service
8.建service的实现类 com.baizhi.service.impl
9.测试service
10.建servlet com.baizhi.servlet
11.配置web.xml
servlet的接收请求参数
含义:浏览器(前台)在向后台发送请求时,通常会携带用户输入的某些内容,在后台需要通过某些手段接收到
前台怎么传
1.直接在浏览器地址框内拼接参数(程序猿|媛在测试时使用的)
2.通过a标签(超链接)传递参数
1.form->action属性要写明传递的路径
2.每个input标签要加name属性,name属性的值,会作为参数传递的键去使用
3.得有提交按钮
请求参数的乱码问题
1.使用超链接,浏览器地址框直接输入,form提交为method=get
作用:设置tomcat传送参数时的编码集
设置servlet接收参数时的编码集
注意:设置接收编码集代码要在接受参数之前
2.使用form提交menthod=post
servlet各司其职
1.负责逻辑判断和跳转的serlvet(XXXServlet,XXXAction)
2.负责动态页面展示的servlet(XXXJsp,XXXView)
多个servlet或者页面如何协同工作
转发
语法
req.getRequestDispatcher("/资源名").forward(req, res);
特点:
1.转发的时候浏览器地址框路径不变(不是错,就是转发的特点)
2.tomcat内部的跳转,浏览器其实并不知情
3.通过转发,不管连接了多少个servlet或者html,这些serlvet或者html都在一次请求过程中
修改
重定向
作用:在servlet中如果使用了重定向,那么servlet就会指导浏览器从新发送一次请求,请求地址可以再重定向的代码中自定义
语法: res.sendRedirect("/项目名/资源名");
特点:
1.重定向的最终请求与地址栏所写请求相同
2.重定向是服务器外部的跳转
3.重定向时,浏览器是知道的
4.用重定向相连接的servlet或html不在同一个请求当中
应用场景:
添加完的展示所有(insertSerlvet---->ShowAllServlet)
删除完的展示所有(deleteByIdServlet----->ShowAllServlet)
修改完的展示所有(UpdateSerlvet----->ShowAllSerlvet)
做完指定的增删改功能后要重定向到展示所有的页面
网络会话技术
cookie
定义:是服务创建的,被保存在浏览器中的,一个字符串类型的,键值对
语法:
创建: Cookie cookie = new Cookie("key","value")
将cookie放入浏览器: res.addCookie(cookie)
如何获取浏览器中的cookie: Cookie[] cookies = req.getCookies();
获取cookie的键 cookie.getName();
获取cookie的值 cookie.getValue();
1.服务器创建出来,存放在每个用户的浏览器中的一个字符串键值对
1.不安全,把信息存放在了客户端(缺点)
2.节省服务的内存空间(优点)
2.只能存放英文,不能存放中文或特殊字符
3.使用cookie的相关方法
创建cookie: Cookie cookie = new Cookie("key","value")
将cookie放入浏览器: res.addCookie(cookie)
从浏览器中去cookie: Cookie[] cookies = req.getCookies()
提取cookie的键: cookie.getName()
提取cookie的值: cookie.getValue();
4.cookie有效时长(cookie的存活时间,cookie的存放内容可以保持的时间)
默认:关闭浏览器,cookie失效
手动设置:
cookie.setMaxAge(60) ----->有效时长为60秒
cookie.setMaxAge(0) ----->当场去世
cookie.setMaxAge(-1) ------>浏览器关闭
1.服务器创建
2.保存在服务器
3.session与浏览器一一对应,不同的浏览器拥有不同的session
4.浏览器第一次访问服务器时,会创建session
5.浏览器第二次访问时,服务器会将第一次访问时创建的session拿来使用
用法
获得session: HttpSession session = req.getSession()
存: session.setAttribute("key",value)
取: Object value = session.getAttribute("key")
移除: session.removeAttribute("key")
强制登录
cookie对比session
cookie
1.保存在浏览器
2.一个浏览器可以拥有多个cookie
3.cookie的有效时长
默认: 关闭浏览器,cookie失效
手动设置:
cookie.setMaxAge(60) --->有效时长60秒
0 ---->当场死亡
-1 ---->关闭浏览器(默认)4.方法
获得: Cookie cookie = new Cookie("key","value");
将cookie放入浏览器中: res.addCookie(cookie);
获取浏览器中的cookie: Cookie[] cookies = req.getCookies();
获得键: cookie.getName();
获得值: cookie.getValue();session
1.保存在服务器中
2.一个浏览器有一个session
3.session的有效时长
默认: 1.关闭浏览器,session失效
2.30分钟内,没有对该程序进行新的请求
手动设置:web.xml
<session-config>
<session-timeout>60</session-timeout> ----设置session在没有新的请求下.60分钟后失效
</session-config>4.方法
获得session: HttpSession session = req.getSession();
取值: Object value = session.getAttribute("key");
存值: session.setAttribute("key",value);
移除值: session.removeAttribute("key");
复习
session和cookie 1WX3ED47UJM8Is
放
cookie:浏览器(由用户保存)
session:服务器(由程序员保存)
2.存什么
cookie: 只能存字符串,只能是英文
session:任意内容(对象,集合,数组)
3.相关方法
cookie:
获得: Cookie cookie = new Cookie("key","value");
把cookie放入浏览器: res.addCookie(cookie);
从浏览器中取cookie: Cookie[] cookies = req.getCookies();
取键 cookie.getName();
取值 cookie.getValue();session
获得: HttpSession session = req.getSession();
取值: Object o = session.getAttribute("key")
存值; session.setAttribute("key",value);
移除值: session.removeAttribute("key");使用时机
1.重不重要(能不能被别人知道)
不是很重要:cookie
重要:session
2.什么类型
是英文字符串:cookie
是其他类型:session
session的工作原理
概念:当一个用户第一次获得session时,服务器会创建一个新的session给用户使用,当服务器第二次获得session时,服务器会将已经创建好的session再次给用户使用
1.30分钟没有新的操作session失效
2.关闭浏览器session失效
原因:关闭浏览器,cookie失效了,那么保存着session唯一标志的cookie就没了,导致,没有办法找到之前使用的session
编码:
import javax.servlet.Filter class MyFilter implements Filter{ init(){}//当filter创建时被执行 detory(){}//当filter销毁时被执行 doFilter(){ //先写执行servlet之前要执行的代码(设置编码) //放行 chain.doFilter(req,res)//如果不想让请求执行原本的servlet,就不写这行代码 //servlet执行完之后要执行的代码 }//过滤器要干的事儿 }
web.xml <filter> <filter-name>随意写</filter-name> <filter-class>filter的全类名</filter-class> </filter> <filter-mapping> <filter-name>随意写</filter-name> <url-pattern>想要过滤的servlet的url-pattern</url-pattern> </filter-mapping>
filter过滤多个servlet
1./* 会过滤该项目中所有的servlet.html.图片.jsp 2./namespace/* 给要过滤的servlet加namespace(命名空间) @WebServlet("/namespace/资源名") 请路径:http://localhost:8989/项目名/namespace/资源名 注意;1.添加了namespace之后,所有页面的跳转,路径都要写成/项目名/要跳转的页面 2.在页面上所展示的图片,css样式....在页面上的路径改成 /项目名/存放图片的文件夹名/图片名(css文件)
相对路径:
概念:以一个参照物为基准,计算另一个文件的位置
举个栗子:
问:办公室在哪儿?
答:13A13教室后门出去左拐再右拐
代码的写法
images/add.png
绝对路径
概念:以地球参照物,计算另一个文件的位置
举个栗子:
问:办公室在哪儿?
答:中国 河南 郑州 金水区 文化路 硅谷大厦A座 14楼 前台东边
代码
/项目名/addPerson.html
补充
三个作用域
作用域:在程序运行过程当中可以保存数据的地方
request
存什么:存任意数据
保存多长时间:一次请求过程
怎么获得:service方法的参数传递过来
怎么存:request.setAttribute("key",value);
怎么取:Object o = request.getAttribute("key");session
存什么:存任意数据
保存多长时间:可以跨越多个请求,只要session不失效就能一直保存,针对用户保存
怎么获得:req.getSession();
怎么存:session.setAttribute("key",value);
怎么取:Object o = session.getAttribute("key");servletcontext
存什么:存任意数据
保存多长时间:整个服务(tomcat开启服务开始,tomcat关闭服务结束),所有用户公用
怎么获得:req.getServletContext();
怎么存:servletContext.setAttribute("key",value);
怎么取:Object o = servletContext.getAttribute("key");