前言:单列设计模式
我们以踢足球(就是一个对象)为例,全场游戏只会有一个足球,但是这个足球什么时候得到
足球本身就在操场上,过去就可以直接玩(对象自己创建好,饿汉式)
要玩的的时候,再去找足球(对象需要调用的时候创建,懒汉式)
饿汉式代码
/*** 饿汉式* 当类加载完毕,不管你用不用这个类的对象,都会为我们提供一个对象*/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 {@Overridepublic 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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理自己的请求,业务}}
Servelet映射细节
url-pattern:*.do 以*.字符串的请求都可以访问 注:不要加/
url-pattern:/* 任意字符串都可以访问
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形式来做提交.





