准备

servlet

一. 简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。

二.引入

1.服务器如何保存并返回一个网页?

    -静态网页

    -- 无论谁看其内容都一样

    -- 服务器直接存储HTMl,直接返回HTML

    -动态网页

    -- 不同的人看到的内容有差异

    -- 服务器保存一个组件,动态给每个用户动态生产网页

    -- 在Java语言中这个组件就是Servlet

    -- 组件:满足规范的对象

2.Servlet的特点

    -- 是服务器端的组件

    -- 满足sun的规范

    -- 可以动态拼接资源(HTML/IMG等)

    -- 术语:处理HTTP协议

三.servlet和jsp的区别与联系

1.区别

①jsp经编译后就变成了Servlet.

(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

②jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.

③Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.

Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。

而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

2.联系

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于:

Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。

而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑

Servlet更多的是类似于一个Controller,用来做控制。

3.总结

①不同之处在哪?

Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容

JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容

②各自的特点

Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差

JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的

③JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。

四.框架

servlet框架由两个Java包组成:javax.servlet和javax.servlet.http

在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类.

在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类.

JSP

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头,以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

XML

XML 指可扩展标记语言。

XML 被设计用来传输和存储数据。

XML 很重要,也很容易学习。

Filter(过滤器)

一.作用

过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。

1.在请求到达Servlet/JSP之前,过滤器截获请求。

2.在响应送给客户端之前,过滤器截获响应。

多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定。最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

二.场景应用

拦截不合理的请求,过滤不应该的响应。当访问服务器资源时,把请求拦截下来,完成一些特殊功能。

1、登录验证:密码或账号不对就不让你过去;

2、权限检查:检查你有没有这个权限,没有就一边去;

3、事务管理:看看你的事务中是否有不该有的东西;

4、统一编码处理:编码必须与上头是一样的,不然就过滤;

5、敏感字符:xxx,xxxx等。

三.使用

1.在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法

2.在web.xml中部署过滤器。

public class MyFilter implements Filter {

    public void init(FilterConfig fc) {

        //过滤器初始化代码

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

        //在这里可以对客户端请求进行检查

        //沿过滤器链将请求传递到下一个过滤器。

        chain.doFilter(request, response);

        //在这里可以对响应进行处理

    }

    public void destroy( ) {

        //过滤器被销毁时执行的代码

    }

}

四.Filter接口

1.public void init(FilterConfig config)

web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,特别需要注意线程同步问题,尽量不用或少用实例变量。 在过滤器的doFilter()方法实现中,任何出现在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。

3.public void destroy()

容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。

4. 关于chain.doFilter(request,response)

它的作用是将请求转发给过滤器链上下一个对象。这里的下一个指的是下一个filter,如果没有filter那就是你请求的资源。 一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起 : request -> filter1 -> filter2 ->filter3 -> .... -> request resource

HttpServlet

一.功能

HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中,大大简化了HttpServlet解析请求数据的工作量。HttpServlet容器响应Web客户请求流程如下:

1)Web客户向Servlet容器发出Http请求;

2)Servlet容器解析Web客户的Http请求;

3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;

4)Servlet容器创建一个HttpResponse对象;

5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;

6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;

7)HttpServlet调用HttpResponse的有关方法,生成响应数据;

8)Servlet容器把HttpServlet的响应结果传给Web客户。

二、创建HttpServlet的步骤——“四部曲”

1)扩展HttpServlet抽象类;

2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法;

3)获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串;

4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。

三.方法重写

1.getParameter与getAttribute两者的区别

①request.setAttribute("xiaoxi", "欢迎用户"+name);//向request域中放置信息 ( 键值对的形式)  名字为xiaoxi  内容为"欢迎用户"+name

②request.getAttribute("xiaoxi");//得到request域中放置名字为xiaoxi的信息

③request.getParameter("name");//得到request域的参数信息(得到jsp页面传过来的参数)

getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 。

getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型

2.转发与重定向的区别

①重定向的执行过程:Web服务器向浏览器发送一个http响应--》浏览器接受此响应后再发送一个新的http请求到服务器--》服务器根据此请求寻找资源并发送给浏览器。它可以重定向到任意URL,不能共享request范围内的数据。

②重定向是在客户端发挥作用,通过新的地址实现页面转向。

③重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址。

④转发过程:Web服务器调用内部方法在容器内部完成请求和转发动作--》将目标资源发送给浏览器,它只能在同一个Web应用中使用,可以共享request范围内的数据。

⑤转发是在服务器端发挥作用,通过forward()方法将提交信息在多个页面间进行传递。

⑥转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址。

步骤

一.项目配置

一定要将Tomcat导入工件!!!

一. 在filter下新建一个EncodingFilter用来解决中文字符集乱码

二. 到web.xml下进行对EncodingFilter相应的配置

三. 在connect下新建一个DBconn类用来处理对数据库的连接操作

四.数据库连接完成后开始项目代码的书写,基本流程:

1.创建实体类

2.创建与数据库相关的操作:增删改查

3.创建具体功能,例如登录注册查看等(都是建立在数据库操作的技术上的)

4.创建servlet以实现从某个页面接参,调用具体功能处理参数,将处理完的参数放入数据库或转发到其他需要这个数据的页面

知识点

一. @Override

是伪代码,表示重写。(当然不写@Override也可以),不过写上有如下好处:

①可以当注释用,方便阅读;

②编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。

二.throw Exception

在调用别人的程序方法,且别人的方法上声明了可能有异常时,调用的地方须有两种处理方式中的一种(不然会提示语法错误):

①也做异常声明-- throw Exception,对异常不处理,收到异常我也向外抛

此时如果没有别的地方接收这个异常,那么异常被jvm接收,然后调用jvm默认的异常处理机制,中止程序

②对异常进行 try—catch 预处理

三.printStackTrace()

在命令行打印异常信息在程序中出错的位置及原因