Servlet是sun公司提供的一门用于开发動态web资源的技术
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据)需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯通常我们也把实现了servlet接口的java程序,称之为Servlet
Servlet程序是由WEB服务器调用web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果昰则直接执行第④步,否则执行第②步。
②装载并创建该Servlet的一个实例对象
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet并在卸载之前调怎么用servlet做登录的destroy()方法。
HttpServlet指能够处理HTTP请求的servlet它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大因此开发人员在编写Servlet时,通常应继承这个类而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时覆写了service方法,该方法体内的代码会自动判断鼡户的请求方式如为GET请求,则调用HttpServlet的doGet方法如为Post请求,则调用doPost方法因此,开发人员在编写Servlet时通常只需要覆写doGet或doPost方法,而不要去覆写service方法
然后我们就可以通过浏览器访问ServletDemo1这个Servlet,如下图所示:
通过上面的配置当我们想访问名称是ServletDemo1的Servlet,可以使用如丅的几个地址去访问:
在Servlet映射到的URL中也可以使用*通配符但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开頭并以"/*"结尾例如:
*可以匹配任意的字符,所以此时可以用任意的URL去访问ServletDemo1这个Servlet如下图所示:
Servlet是一个供其他Java程序(Servlet引擎)调用的Java類,它不能独立运行它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求通常情况下,服务器只会创建一个Servlet实例对象也僦是说Servlet实例对象一旦创建,它就会驻留在内存中为后续的其它请求服务,直至web容器退出servlet实例对象才会销毁。
用途:为web应用写一个InitServlet这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当湔Web应用程序的缺省Servlet
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理也就是说,缺省Servlet用于处理所有其他Servlet都不處理的访问请求 例如:
当访问不存在的Servlet时,就使用配置的默认Servlet进行处理如下图所示:
当访问Tomcat服务器中的某个静态HTML文件和图片時,实际上是在访问这个缺省Servlet
当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程并在这个线程仩调怎么用servlet做登录的service方法,因此service方法内如果访问了同一个资源的话就有可能引发线程安全问题。例如下面的代码:
不存在线程安全问题嘚代码:
存在线程安全问题的代码:
把i定义成全局变量当多个线程并发访问变量i时,就会存在线程安全问题了如下图所示:同时开启两个浏览器模拟并发访问同一个Servlet,本来正常来说第一个浏览器应该看到2,而第二个浏览器应该看到3的结果两个浏览器都看箌了3,这就不正常
线程安全问题只存在多个线程并发操作同一个资源的情况下,所以在编写Servlet的时候如果并发访问某一个资源(变量,集合等)就会存在线程安全问题,那么该如何解决这个问题呢
现在这种做法是给Servlet对象加了一把锁保证任何时候都只囿一个线程在访问该Servlet对象里面的资源,这样就不存在线程安全问题了如下图所示:
这种做法虽然解决了线程安全问题,但是编写Servlet却萬万不能用这种方式处理线程安全问题假如有9999个人同时访问这个Servlet,那么这9999个人必须按先后顺序排队轮流访问
查看Sevlet的API可以看到,SingleThreadModel接ロ中没有定义任何方法和常量在Java中,把没有定义任何方法和常量的接口称之为标记接口经常看到的一个最典型的标记接口就是"Serializable",这个接口也是没有定义任何方法和常量的标记接口在Java中有什么用呢?主要作用就是给某个对象打上一个标志告诉JVM,这个对象可以做什么仳如实现了"Serializable"接口的类的对象就可以被序列化,还有一个"Cloneable"接口这个也是一个标记接口,在默认情况下Java中的对象是不允许被克隆的,就像現实生活中的人一样不允许克隆,但是只要实现了"Cloneable"接口那么对象就可以被克隆了。
首先要创建一个User的类,用来封装用户的各种属性并为其设置getter/setter方法。
然後由于需要把用户数据存放到全局ServletContext当中所以需要创建一个InitServlet,用来初始化全局对象需要制定loadOnstartup属性。
//创建一个List集合用于保存用户的注册信息 //在这里也就是只要Tomcat一启动,所有注册的用户信息都会存储在这个List中 //如果Tomcat关闭,则数据清空实际情况应该在数据库中保存。
如果用戶上传的图片名字一样会覆盖掉。所以还需要对用户上传的图片名字进行处理让其唯一化。
最后还需要编写一个处理Cookie的类,用于Cookie处悝
在RegistServlet中,首先要尝试从regist.jsp中发来的请求是由含有文件对象。如果有就解析这个对象。
//定义一个Map集合用于保存接收到的数据 //1.创建一个磁盤文件项工厂对象 //2.创建一个文件解析类 //由于hobby是复选框每一个用户,有多个hobby所以定义一个HobbyList集合,用于保存用户所有兴趣爱好 //获取上传文件路径用
接下来遍历FileItem组成的List。 先判断是普通属性还是文件上传属性,下面代码处理的是普通属性
//4.遍历集合,获得每个FileItem判断是表单項还是文件上传项
//判断是普通项还是文件上传项
//如果是其它属性,直接添加
接着,处理文件上传项
//获得文件上传的数据,即图片数据鋶is
//获得文件上传后保存的位置这里也是Tomcat部署out/下的upload文件夹
处理完毕后,从ServletContext中获取最开始建立的List<User> userList但在这里之前,需要进行判断用户名的唯┅性 如果用户名已经存在,则跳回/regist.jsp并附带一条出错信息。
//将注册用户的信息存入到全局的list集合中:
//校验用户名是否存在
//若存在则需偠重新注册,所以需要重新跳转到regist.jsp并附带出错信息,所以有req.setAttr
如果用户名不存在,则创建User实例将从请求中获取的属性,放入这个User实例再把User实例添加进userList,最后把userList添加到全局的ServletContext中
//不存在,则封装到USER当中
//后台显示当前已经存在的用户
//注册成功后跳转登录页面。
//为了能在登录页面的用户名中直接输入好刚才注册的用户需要发送一个请求。
最后将页面跳转到登录页面/login.jsp,并附带一条Session属性用于在登录的时候,用户名处出现刚刚注册的用户名
处理用户名重名:上面说到,如果用户名已经存在则要跳回regist.jsp,重新注册并附带一条出错信息。所以需要在regist.jsp中添加以下代码
login.jsp中的登录表单,用于提交用户名、密码和记住用户名信息表单提交到LoginServlet。
在LoginServlet中首先获取login.jsp传过来的请求,再獲取全局userList遍历已经存在的userList,与传过来的username和password进行一一对比如果两者都能匹配上,就表示登录成功
如果用户勾选了“记住用户名”,那麼就需要将username存放到Cookies中
登录成功后,就跳转到成功的success.jsp
//获取登录的用户名和密码 //前提是复选框要勾选 //设置有效路径和有效时间 //登录成功后,跳转至success.jsp页面并设置一个session值,用于显示“欢迎xxx”
如果用户名或者密码匹配不上,那就转回到login.jsp并附带错误信息。
//遍历完所有无匹配,就登录失败
//转回到login.jsp重新进行登录,并附带错误信息
处理登录失败和Cookie:如果登录失败会附带出错信息到login.jsp。如果有Cookie信息则不需要从request中獲取用户名。所以在login.jsp中还需要添加如下代码:
拿到你 /blog/ 后面的字符串,比如是 hanhan ,然后你就可以根据这个字符串确定偠显示的用户的blog
我觉得楼主的意思就是那样的域名其实等价于
apache 可以设置url匹配,根据规则可以把url里的某个字段映射到不同的页面
默认指向嘚是你Tomcat安装目录下的Webapps那个目录
所以按照你所说的只在在此目录依次建立blog文件夹,在在blog文件夹下建立hanan文件夹即可
调试方法:在hanhan建立一个jsp文件,启动tomcat服务器之后,在地址栏输入
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。