Servlet学习

Servlet是什么????
是用Java编写的服务器端程序。在没有jsp之前,它应该属于前台。在有jsp之后,它的分工就变了。

其主要功能在与交互式的浏览和修改数据,生成动态Web内容。servlet负责跟浏览器交互,接受浏览器的数据,返回数据给浏览器。接受浏览器数据是http请求,响应浏览器数据是响应

转发和重定向区别:

区别一:转发发生在服务器,重定向发生在客户端。

区别二:转发发生一次请求,重定向发生两次请求。

区别三:重定向时的网址可以是任何网址,转发的网址必须是本站点的网址。(转发不可以跨域,重定向可以跨域)

区别四:转发地址栏没有变化;重定向地址栏有变化

cookie和session的区别:

区别一:cooKie数据保存在客户端,session保存在服务器。

区别二:cookie安全性不如session

区别三:session会占用服务器性能,考虑到减轻服务器压力方面,一般使用cookie。

区别四:cookie中保存的是字符串,session中保存的是对象

区别五:单个cookie保存的数据不超过4k,session没有限制。

转发和重定向

请求:

//使用request,请求域来做数据的传递
req.setAttribute("name", "匿名君");
//转发,这里操作是有服务器完成,所以采用的地址是服务器端地址
req.getRequestDispatcher("/ForwardServlet2").forward(req, resp);
响应:
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
//从request域中拿出name属性
String name = (String) req.getAttribute("name");
resp.getWriter().write("ForwardServlet2:" + name);
重定向的代码:
请求:
req.setAttribute("name", "匿名君");
//推荐下面的写法 重定向
resp.sendRedirect(req.getContextPath() + "/RedirectServlet2");
响应:
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
String name = (String) req.getAttribute("name");
resp.getWriter().write("RedirectServlet2 " + name);

访问HTML与访问Servlet有什么区别:

访问HTML页面时Web服务器直接返回HTML页面,访问Servlet时Web服务器调用Servlet的方法,由Servlet动态生成HTML页面,而且需要在web.xml中配置URL路径。

狭义的servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet的类,

WEB服务器:

  安装了WEB服务器软件的一个电脑,tomcat

启动服务器之后,在浏览器输入 http://localhost:8080,页面如果可以加载,表示tomcat启动成功。

Servlet:

静态资源:
    用户在多次访问的情况下,但是每一次页面的源代码没有发生任何的改变
动态资源:
    用户每一次访问,申请到的页面源代码都是不一样的   

Servlet是Java语言实现动态资源的开发技术

要求:
    1. Servlet程序只能在Tomcat服务器上运行  【记住】

    2. Servlet其实是一个非常普通的类,只不过继承了HttpServlet,覆盖了doGet和doPost方法

手动写一个Servlet步骤:

1. 定义一个类,要求继承HttpServlet

2. 书写Servlet程序

3. 执行Servlet程序
    这里servlet程序不能再交给Eclipse执行了,而是要在Tomcat服务器上执行Servlet程序
    在Tomcat服务器软件根目录下webapps中创建一个Web项目文件夹,要按照Web项目要求创建
    |-- Day39
        |- WEB-INF:【固定写法】
            |- classes:    找到当前Servlet程序的class文件,要把这个文件放入到classes文件中
                          【注意】要求放入的class文件要带有完整的包名

            |- web.xml 按照Servlet程序的规范书写XML文件


 <!--4. WEB.xml文件中的内容 -->
 <servlet>
  <!-- servlet的内部名称 这个名字可以自定义-->
  <servlet-name>HelloServlet</servlet-name>
  <!-- servlet程序的class文件 要求是完整的类名,也就是包名.类名 -->
  <servlet-class>a_firstServlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <!-- servlet的名字 【要求和上边的名字必须一模一样】-->
  <servlet-name>HelloServlet</servlet-name>
  <!-- servlet的访问名称: http://localhost:8080/mywebs/访问名 -->
  <url-pattern>/hello</url-pattern>

  </servlet-mapping>

HTTP协议对应浏览器来说可以分为两大类:
    HTTP请求:从浏览器发送给服务器的请求内容

    HTTP响应:浏览器接受服务器发送的数据内容

请求:

//获取请求的路径
System.out.println(req.getRequestURL());
// http://localhost:8080/Day40/RequestTest1
System.out.println(req.getRequestURI());
// /Day40/RequestTest1
//获取请求的方式是哪一种

System.out.println(req.getMethod());

响应:

两种响应模式,一种是跳转到一个前端页面,另一种是自己写的前端页面

resp.setHeader("location", "/Day40/index1.html");

//向浏览器发出响应,给浏览器发数据

//解决中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//获取到响应的打印流对象
PrintWriter pw = resp.getWriter();
String html = "<html>";

html += "<head>";

html += "</head>";
html += "<body>";
html += "这有啥看不懂的~~~";
html += "</body>";
html += "</html>";
pw.write(html);

pw.close();

HTTP请求和响应:

HTTP请求报文
HTTP请求报文由3部分组成(请求行+请求头+请求体)

Servlet学习

请求行:包括请求方法,请求url,协议名和版本号
①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。
请求头:服务器可以根据请求头内容获取客户端信息和缓存信息,属性和属性值一一对应。
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
与缓存相关的规则信息,均包含在header中
请求体:请求参数包含在内
⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

HTTP响应报文
HTTP的响应报文也由三部分组成(响应行+响应头+响应体)

Servlet学习

响应行:包括协议及版本,状态码和状态描述
①报文协议及版本; 
②状态码及状态描述;
响应头:响应头也是属性和属性值一一对应
③响应报文头,也是由多个属性组成;
响应体:譬如用户名密码的一些参数
④响应报文体,即我们真正要的“干货”

get和post区别:
一,get参数通过url传递,post放在请求体中。

二,get是明文传递,post可明文可密文。

三,get传输过程中数据不安全,post传输过程中数据更安全。get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。

四,get传输参数有长度限制,post没有,get常用于获取数据,post常用于修改数据。

Servlet的自动加载:设置优先级

用来在Tomcat服务器上提前加载一些重要的servlet

servlet生命周期:

先加载并实例化,这也是步骤

servlet什么时候初始化,当客户端第一次访问到某一个servlet时候(过滤器是服务器一启动就会初始化)

servlet什么时候被销毁,servlet只要初始化后就会一直存在,一直到tomcat关闭,才会销毁。

一,初识化阶段,调用init方法初始化servlet对象,只调用一次。

二,响应客户请求阶段,调用service方法。可以调用多次。

三,终止阶段,调用destroy销毁servlet对象,只调用一次

ServletConfig用处:通过ServletConfig获取Servlet的初始化参数

在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

  当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

ServletContext:用处

一,多个Servlet通过ServletContext对象实现数据共享
范例:ServletContextDemo1和ServletContextDemo2通过ServletContext对象实现数据共享

先运行ServletContextDemo1,将数据data存储到ServletContext对象中,然后运行ServletContextDemo2就可以从ServletContext对象中取出数据了,这样就实现了数据共享,

二,获取WEB应用的初始化参数
  在web.xml文件中使用<context-param>标签配置WEB应用的初始化参数,

三,用servletContext实现请求转发

会话的概念

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

保存会话数据的两种技术

Cookie
  Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session

  Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

session的用途及工作原理

客户端初次请求服务器时,服务器会根据随机数、时间、硬件信息生成一个SessionID,这是一个算法,目的是为了保证 SessionID的唯一性,同时还会生成一个类HashTable结构保存请求中的用户数据;服务器将SessionID随同响应一起发送给 客户端,客户端收到响应后,将响应头中的SessionID保存到Cookie中,如果服务器端设置了过期时间,则在过期时间内 用户的每次请求都会使用同一Cookie随请求一起发送到服务器端,服务器端会根据SessionID来使用对应的HashTable中的 用户信息;用户可以在客户端一直保持登录状态或者处于拥有某种权限的状态;

cookie和session的区别: