Servlt
maven
Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包
创建web项目
1.
![](https://img-blog.csdnimg.cn/img_convert/3b2dba4f77a4f0ba645e73278bd3b2a1.png)
2.
![](https://img-blog.csdnimg.cn/img_convert/f34cd8223118b71a3738f5f916e30958.png)
3.
![](https://img-blog.csdnimg.cn/img_convert/2d39f3a2eba0af164ff7aef7033afaf3.png)
toncat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
配置tomcat
1.
![](https://img-blog.csdnimg.cn/img_convert/a2c867051867d2cb79ed6317e47eb33e.png)
2.
![](https://img-blog.csdnimg.cn/img_convert/52809c6c3d8b9313ca26ebee0912eaea.png)
3.
![](https://img-blog.csdnimg.cn/img_convert/0788e7fce83c89091f3c46cb1b33380c.png)
4.
![](https://img-blog.csdnimg.cn/img_convert/9c6eaefd1419fa2a13555dcf83d1658e.png)
servlet配置
创建java类,继承HttpServlet,重写其中的service方法
public class BMIServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws
ServletException, IOException {
// 1. 设置编码
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
// 2. 获取参数: -- url:
// http://localhost:8080/bmi?tz=60&sg=1.7
// ? key=value & key1+value1 , &用于分隔参数
String tz = req.getParameter("tz");
String sg = req.getParameter("sg");
// 3. 处理数据
double tz1 = Double.valueOf(tz);
double sg1 = Double.valueOf(sg);
double bmi = tz1 / (sg1 * sg1);
// 4. 响应结果
PrintWriter writer = resp.getWriter();
String str = "";
if(bmi < 18){
str = "太瘦了";
}else if(bmi < 24){
str="标准身材";
}else if(bmi < 28){
str="超重了";
}else {
str="肥胖状态。";
}
writer.println("你的bmi是:" + bmi + "\n");
writer.println("<b style='color:red'>"+str+"</b>");
}
在web.xml中配置servlet的访问路径
<servlet>
<servlet-name>bmi</servlet-name>
<servlet-class>action.BMIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bmi</servlet-name>
<url-pattern>/bmi</url-pattern>
</servlet-mapping>
htpp协议
特点:一发一收,一问一答
![](https://img-blog.csdnimg.cn/img_convert/6acd42090cba0cbbb1f8b653eeb35852.png)
HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0
协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
请求方式 get 请求参数在url地址后显示 数据量比较小 不安全 不支持文件上传 get请求: ① 浏览器地址栏直接访问 , ② form的method设置为get , ③ 超链接 , ④ 异步请求的时候,设置为get. post 数据放在消息体中的 数据量大 相对安全 支持文件上传 post请求: ① form的method设置为post , ② 异步请求的时候, 设置为post
servlet生命周期
![](https://img-blog.csdnimg.cn/img_convert/5d7055fc8c3da36bf979dcbed21810ba.png)
容器启动的时候,或者第一次访问servlet的时候 , 会执行init方法,一个生命周期之内只执行一 次。 servlet被访问的时候,反复执行 service(doXX)方法。 容器结束运行的时候,执行destroy方法,一个生命周期之内只执行一次。
转发和重定向
转发
一个请求完成部分功能,希望剩下的功能由另一个请求完成,这种时候使用转发. 一般使用servlet完成数据处理, 转发数据到jsp页面,实现数据的展示。 转发可以通过request对象,把数据转发给另一个请求 转发的本质是一个请求,因为request对象不变(可以共享request中的数据)。 转发之后,浏览器地址栏显示的是第一个请求的地址。
重定向
某个请求完成之后,希望浏览器自动发起另一个请求,则使用重定向。 使用重定向的时候,浏览器消息头中收到一个302状态码和url地址。浏览器根据这个状态码和 url地址,自动发起请求。 重定向是完全不同的两个请求,是两个request对象,两个请求的数据无法共享。 浏览器地址栏显示的是第二个请求的地址
if(servletPath.equals("/delete.do")){
String bookId = req.getParameter("bookId");
if(bookId == null){
req.setAttribute("msg" , "只能根据id删除数据。");
RequestDispatcher rd =
req.getRequestDispatcher("./book/info.jsp");
rd.forward(req ,resp);
}else{
Boolean aBoolean = service.deleteOne(Integer.valueOf(bookId));
if(aBoolean == false){
req.setAttribute("msg" , "删除失败");
RequestDispatcher rd =
req.getRequestDispatcher("./book/info.jsp");
rd.forward(req ,resp);
}else{ // 删除成功,重定向到list.do (重定向是第二个请求)
resp.sendRedirect("list.do"); // sendRedirect -- 重定向
}
}
}
cookie
客户端状态管理:cookie技术,把数据保存在浏览器中,就是客户端的状态管理。 服务器端创建cookie对象,再添加到浏览器中。 浏览器保存响应结果中邀请你需要add的cookie对象,每个cookie和自己的请求的域名一致。 浏览器每次给服务器发请求的时候,会将请求对应的域名中保存的cookie数据,一起发送到服务 器。 服务器通过request获取cookie对象的数据,根据cookie的name,找到value值,进行使用value.
Cookie c = new Cookie(key ,value);
response.addCookie(c)
//创建cookie对象
cookie的有效期
cookie.setMaxAge(秒) -- 设置cookie的有效期
setMaxAge(正数) : 有效期就是当前时间 + 正数的秒数。 setMaxAge(0) : 立即失效, 表示cookie过期了。 没有调用setMaxAge 或者 setMaxAge(负数) : 表示会话期间有效。浏览器关闭,cookie失效了。 默认设置。 会话期间: 浏览器第一次访问某个服务器,到浏览器关闭的期间,称为一个会话。
cookie的特点
用户可以删除cookie 用户可以禁止使用cookie 存储小于4k的内容 cookie的个数不能超过300个 只能存储字符串 cookie不安全
session
session对象的获取 sesssion对象的获取,和请求中从浏览器中传输到服务器的cookie(JSESSIONID)有关系。 根据JSESSIONID 这个cookie, 去查找当前请求对应的session对象。
// 根据sessionId 获取session对象,如果没有获取到,就创建一个session.
HttpSession session = request.getSession()
// true: 同 request.getSession() 一样,就是找不到就给创建一个。
// false : 找不到session对象,就返回null.
HttpSession session = request.getSession(boolean)
session.setAttribute(String , Object) -- key,value
Object obj = session.getAttribute(String) -- 根据key找到value
session.removeAttribute(String) -- 根据key ,删除数据
如果没有设置有效期,默认的有效期是30分钟,如果会话结束了,session一般就无效了。 设置session无效 一般系统又一个退出功能,可以清空session中保存的数据, 使用session的invalidate方法, 设置session为无效
Jsp
jsp使用
jsp是sun公司制定的一种用于服务器端的动态页面的技术规范,也是一种组件,依赖于容器(tomcat)进 行运行。 jsp不需要再web.xml中进行配置,直接通过它的路径和文件名进行访问。 jsp是一种运行在服务器端的页面,它里面可以包含html , 嵌入一些java代码,通过在tomcat容器中经 过解析,输出为html页面。 servlet : 数据的处理和数据的展示(拼html标签) servlet + jsp : servlet做数据处理, jsp做数据的展示。 servlet做数据展示的时候,不方便(编写代码的时候, 维护代码的时候) jsp : 让数据的处理和数据的展示进行分离(解耦)
jsp页面上写java代码
<%
// java 代码
String str = "hello jsp!";
%>
JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class)
表达式脚本
格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
特点:
(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以 直接使用_jspService()方法参数中的对象
(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上
(3) 表达式脚本中的表达式不能以分号结束
jsp9个内置对象
request:请求对象
response:响应对象
pageContext:JSP的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:JSP输出流对象
page:指向当前JSP的对象
exception:异常对象
jsp四个域对象
![](https://img-blog.csdnimg.cn/img_convert/391f076956fdec25d6665734d1120ec0.png)
EL表达式
在jsp页面中, 可以直接通过el表达式,获取到存储在pageContext, request, session , application中的数据。
语法规则:${对象},¥{对象.属性名}
对象符合java bean的规范(描述类的属性私有化,提供公开的get/set方法。比如 属性 名叫abc , 对应的方法叫getAbc / setAbc) ${对象.属性名} ,这里的本质是调用属性名对应的get方法。 el表达式的查找数据方式 从pageContext, request, session , application等对象中,查找需要输出的对象 pageContext, request, session , application如果出现了同名的key , 那么查找按小范围优选 的原则查找 可以通过pageScope, requestScope , sessionScope, applicationScope 指定查找范围。
Filter
fliter的使用
sun公司提供的一种特殊的组件规范,主要用于拦截容器的调用过程。 规范: 实现Filter接口(实现doFilter方法) 特殊:过滤器不能单独使用,需要和servlet进行配合使用 组件:实现软件的某个模块功能,需要在容器中运行。 容器: 一个特殊的软件,可以运行组件 支持多个Filter , 以在web.xml中的配置的顺序进行过滤。
Filter的生命周期
实例化 (调用构造函数) -- 1次 初始化(调用init函数) -- 1次 就绪(调用doFilter函数) -- 任意次 销毁(调用destroy函数)-- 1次
public class LifeFilter implements Filter {
public LifeFilter(){
System.out.println("LifeFilter 构造函数......");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("LifeFilter init函数......");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException,
ServletException {
System.out.println("LifeFilter doFilter函数......");
filterChain.doFilter(servletRequest , servletResponse);
}
@Override
public void destroy() {
System.out.println("LifeFilter destroy函数......");
}
}
错误总结
1.404:代表 此请求路径找不到对应的资源, 检查请求的路径是否正确(页面中发出的请求路径和web.xml配置文件中Servlet处理的路径是否匹配)
![](https://img-blog.csdnimg.cn/img_convert/d139cfb239cb659118a97a49999a78fc.png)
2.web.xml配置错误
![](https://img-blog.csdnimg.cn/img_convert/1396dac8fef26ebcab39bc31afe11295.png)
3.500错误
servlet代码出错