暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Servlet(上)

敲代码的人 2019-07-18
125

前言:单列设计模式

我们以踢足球(就是一个对象)为例,全场游戏只会有一个足球,但是这个足球什么时候得到

  1. 足球本身就在操场上,过去就可以直接玩(对象自己创建好,饿汉式)

  2. 要玩的的时候,再去找足球(对象需要调用的时候创建,懒汉式)


饿汉式代码

/**
* 饿汉式
* 当类加载完毕,不管你用不用这个类的对象,都会为我们提供一个对象
*/
public class Football1 {
//私有构造方法,不能让外人创建
private Football1(){}

private static Football1 fb1 = new Football1();

public static Football1 getFb(){
return fb1;
}
}

懒汉式

/**
* 懒汉式 当系统用到这个对象的时候,才创建这个对象,系统不用的时候不创建
*/
public class Football2 {
private Football2() {
}


private static Football2 fb2 = null;


public static Football2 getFb() {
if (fb2 == null) {
fb2 = new Football2();
}
return fb2;
}
}


Servlet介绍:

servlet是运行在Web服务器中小型的java程序(即:服务端的小应用程序).servlet通常HTTP(超文本传输协议),接收和响应来自 Web 客户端的请求。


编写一个自己servlet类

ecplise中集成tomcat

public class Myservlet1 implements Servlet{
//接收用户请求,并做出响应
public void service(ServletRequest reuqest, ServletResponse response) throws ServletException, IOException {
    System.out.println("Myservlet1 执行了");  
  }
}

配置web的xml

  <!-- 创建一个servlet实例 -->
<servlet>
<servlet-name>myservlet1</servlet-name>
<servlet-class>com.huge.demo1.Myservlet1</servlet-class>
</servlet>

<!-- 给servlet提供一个可以访问的地址 -->
<servlet-mapping>
<servlet-name>myservlet1</servlet-name>
<url-pattern>/test.do</url-pattern>
</servlet-mapping>

测试:localhost:8080/07-webTest/test.do


注:访问时,没有自己创建Myservlet1的对象,说明,servlet是tomcat为我们自己创建好了


执行过程



Servlet的声明周期

实例化-->初始化-->服务->销毁

出生:(实例化-->初始化)第一次访问Servlet就出生(默认情况下)

活着:(服务)应用活着,servlet就活着

死亡:(销毁)应用卸载了servlet就销毁,获取服务器正常关闭。


可以通过构造方法,简单查看生命过程

public class Myservlet1 implements Servlet{
public Myservlet1(){
System.out.println("Servlet1实例化");
}

public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet1初始化");

}


//接收用户请求,并做出响应
public void service(ServletRequest reuqest, ServletResponse response) throws ServletException, IOException {
System.out.println("Myservlet1 执行了");

}

public void destroy() {
System.out.println("Servlet1销毁了");
}
}

通过测试可以看到实例化和初始化只会执行一次,再第一次访问servlet的时候,说明这种方式是懒汉式的单列模式


在web.xml中加入<load-on-startup>.tomcat启动的时候,就为我们自己创建好了对象,变成了饿汉式单列模式

 <!-- 创建一个servlet实例 -->
<servlet>
<servlet-name>myservlet1</servlet-name>
<servlet-class>com.huge.demo1.Myservlet1</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

注意:这里的单例是假的

假单例:表示servlet对象我们是可以手动创建对象的.

真单例:我们手动是不能创建对象的


三种创建Servlet方式

1.实现顶级接口Servlet

需要全部重写其中的方法


2.继承javax.servet.GenericServlet抽象类(适配器模式)

这个类也是实现了servlet顶级接口,但是实现部分方法,所以只要实现一个service方法

public class Myservlet2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}


3.继承javax.servlet.http.HttpServlet类(模板方法设计模式)

是一个抽象类,继承了GenericServlet,里面实现了所有的方法,包括service方法

当一个请求过来时,会执行servlet中service方法,根据多态,,会执行子类中service方法,会把请求转换为http形式的,在执行自己的重载方法

会根据doget,或者dopost方法,再去执行

当时里面全是报错内容,所以在继承HttpServlet后,只要重写doGet,和doPost,方法就好了,根据多态,会执行子类重写的方法的.(如果有其他方式,如doPut等,也要重写)

public class Myservlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理自己的请求,业务
}
}


Servelet映射细节

  1. url-pattern:*.do  *.字符串的请求都可以访问 注:不要加/

  2. url-pattern:/*  任意字符串都可以访问

  3. url-pattern /action/* /action开头的请求都可以访问


匹配规则:

优先级:从高到低

绝对匹配-->  /开头匹配 --> 扩展名方式匹配


如果url-pattern的值是/,表示执行默认映射。所有资源都是servlet


get提交和post提交的区别

get提交

(1)    参数传递来分析,参数是显示的挂在url地址栏的后面

  •  安全性低

  • 由于所有的参数都是显示的挂在地址栏的后面,如果参数过多,或者值的字符量较大.参数的传递有可能被截断,传递信息不全

(2)    数的中文支持性

后台接收的参数,支持中文

但是,这是我们tomcat比较高的版本,能够达到中文开发环境字符编码的高度统一.如果我们使用的是版本比较旧的tomcat,那么有可能get提交的中文参数会出现乱码.

如果tomcat版本较低,我们需要进行处理

(3)    性能

get提交执行效率相对较高


post提交

(1)    参数传递来分析

参数为隐藏传递,没有显示的挂在url地址栏的后面(原来为用的http协议请求体内部参数打包的形式传递)

  •  安全性高

  •  参数不出现在url地址栏上,不会出现参数传递受到限制的情况.


(2)    参数的中文支持性

接收的中文参数,默认为乱码

需要在接收参数代码执行前,执行一句处理中文参数字符编码的代码

req.setCharacterEncoding("UTF-8");


建议使用get提交效率较高,否则一律创建表单,使用post形式来做提交.



文章转载自敲代码的人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论