Servlet

引言:目前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方法
}

第一个servlet

1.创建项目,导入servlet-api.jar

2.编写自定义servlet

需求每次用户访问,给用户当前时间

3.问题将servlet部署到tomcat

答案:servlet.java servlet.class

问题:保存在哪?

4.web.xml

  作用:给自定义servlet取网络协议名(url-pattern)

  在web.xml中注册servlet

tomcat中的存放位置:WEB-INF下

servlet的执行流程

执行流程含义:当浏览器发送了一个请求,中间发生了什么,最终导致servlet被执行

乱码问题

web项目目录结构

练习

查询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标签(超链接)传递参数

3.通过form表单传递参数

1.form->action属性要写明传递的路径

2.每个input标签要加name属性,name属性的值,会作为参数传递的键去使用

3.得有提交按钮

后台怎么收

String  value =   req.getParameter("key")

登录功能(假)

请求参数的乱码问题

1.使用超链接,浏览器地址框直接输入,form提交为method=get

作用:设置tomcat传送参数时的编码集

设置servlet接收参数时的编码集

注意:设置接收编码集代码要在接受参数之前

2.使用form提交menthod=post

注解开发servlet

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) ------>浏览器关闭



session

特点:

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再次给用户使用

session有效时长

1.30分钟没有新的操作session失效

2.关闭浏览器session失效

原因:关闭浏览器,cookie失效了,那么保存着session唯一标志的cookie就没了,导致,没有办法找到之前使用的session

过滤器

作用:当用户要访问servlet时,会拦截访问,先执行自己内部的代码,执行完毕后,可以选择是否让请求再去执行servlet里的代码

编码:

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");
以粮为纲全面发展
原文地址:https://www.cnblogs.com/alexliuf/p/13793204.html