Servlet技术详解(二)

 

一个简单的例子

好了,讲了这么多,你一定是跃跃欲试了,我们就用一个登录控制的例子来简单的看一下servlet开发的步骤.

  • 使用ide新建一个web项目
  • 创建一个前端登录表单login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>roobtyan登录控制系统</title>
</head>
<body>
    <h1 align="center" style="color: red;">欢迎您登录系统后台</h1><hr/>
    <%--the form start--%>
    <div align="center">
        <form method="post" action="/login">
            Username:<input type="text" name="username"/><br/><br/>
            Password:<input type="password" name="password"/><br/><br/>
            <input type="submit" value="登录"/>
        </form>
    </div>
</body>
</html>

 

  • 创建一个登录成功页面
    同样使用jsp页面
    welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
    <h1 align="center" style="color: red">Welcome:</h1>
    <%
        out.println(session.getAttribute("user"));
    %>
    <hr/>
    <span style="align:center; color:yellow">
        Time:<%
            out.println(new Date());
        %>
    </span>
</body>
</html>
  • 创建LoginServlet.java
public class LoginServlet extends HttpServlet {
    public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        //设置字符编码
        request.setCharacterEncoding("utf8");
        //从request对象中获取username,password
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //判断是否为管理员
        if("administrator".equals(username)&&"123456".equals(password)){
            //登录成功,设置session
            HttpSession session = request.getSession(true);
            session.setAttribute("user", "管理员,欢迎你!");
        }else {
            session.setAttribute("user","登录信息错误,请检查用户名或密码");
        }
        //将页面转发到欢迎页面
        requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
        requestDispatcher.forward(request,response);        
    }
}
  • 配置servlet
    这里对于servlet的配置,我们采取web.xml的方式,主要是因为这种方法相对麻烦,为了让你有着更好的理解,就这样做了.
<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.roobtyan.cn.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
</servlet-mapping>

这样,我们的第一个servlet程序就做完了.我想如果你存在疑问的话,应该是在jsp技术上,如果是这样,那么请参照我的博客:Jsp技术介绍
还有一个地方你可能存在疑惑,为什么使用request.getParameter方法可以获取到提交的表单中的内容呢?这个很好解释,因为前端使用post或者get方法将表单信息提交到servlet的时候,将表单信息封装成了request对象,这样就可以获取到了.值得注意的是,表单中的name字段,就是我们获取值的根据.
最后一个可能存在疑问位置就是这里

//将页面转发到欢迎页面
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);

这段代码我在最后会解释,其实也挺简单的
上面的你都注意到了,那你非常厉害了.不过,有一个地方你可能注意不到,那就是这段代码:

request.setCharacterEncoding("utf8");

设置字符编码的这部分,如果不设置,会造成乱码,这还是需要注意的.关于POST和GET乱码的解决,请看我的文章:POST和GET乱码的解决

Servlet自动加载

前面我们说了,servlet只有在第一次被访问的时候才会加载,这肯定会造成第一个访问的人访问时间较长,因为他需要等待servlet完成加载.那么,有没有什么方法能够使得servlet自动加载呢,就是在启动服务器的时候就将servlet加载起来呢?
答案是有的,同样可以在web.xml中进行配置

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.roobtyan.LoginServlet</servlet-class>
    <!-- 让servlet对象自动加载 -->
    <load-on-startup>1</load-on-startup>  
 </servlet>

 

就是使用的

<login-on-startup></login-on-startup>

 

配置的,注意: 其中的整数值越大,创建优先级越低!

Servlet多线程问题

前面我们讲了,一个servlet在服务器中只会存在一个实例,不论是有多少访问,都掉用的同一个实例,也就是单实例多线程的.这就存在着一定的线程安全问题,比如说,我在servlet中定义了一个局部变量,那么这个变量的值很有可能不是我期待的值,所以,在servlet中要尽量避免使用局部变量.

Servlet中重要的对象

在servlet中共有四个重要的对象:

HttpServletRequest  请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象    servlet配置对象
ServletContext对象  servlet的上下文对象

前两个我们介绍的不少,这两个的具体内容我回单独拿出来一章介绍,和HTTP协议一块介绍,我觉得这样看起来更能接受一些.
那么我们现在就介绍后面两个

ServletConfig对象

  • 创建时间:在创建完servlet对象的时候,接着创建servletConfig对象.
  • 如何得到对象:直接使用ServletConfig config = this.getServletConfig();
  • 简单使用
    这是web.xml的配置文件
 <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.roobtyan.LoginServlet</servlet-class>
    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
    <init-param>
        <param-name>location</param-name>
        <param-value>doom</param-value>
    </init-param>
  </servlet>

 

配置文件中的init-param就是配置信息
这个ServletConfig对象共有如下的方法

java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值
java.util.Enumeration getInitParameterNames()             获取所有参数
ServletContext getServletContext()                          得到servlet上下文对象
java.lang.String getServletName()                        得到servlet的名称

这个对象比较简单,就不过多介绍,注意,这个对象只能在自己的servlet中使用,超出了范围就不行了.

ServletContext对象

  • 创建时间:加载web应用时创建ServletContext对象
  • 得到对象:从ServletConfig对象的getServletContext方法得到
    这个对象又几个比较重要的方法,我们来介绍一下.
  • 作用:在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等
java.lang.String getContextPath()   --得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()  
void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)  
void removeAttribute(java.lang.String name)  
RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)

具体的方法使用就是这样,按照API去用就可以了,我就不再过多介绍

转发

转发

刚才我们用到的

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);

这个就是转发,按照这样用就可以了

重定向

与转发功能相似的是重定向,重定向的使用是这样的:

response.sendRedirect("/welcome.jsp");

这样也会访问到welcome.jsp这个页面.
这就是之前的Respose对象,咱们先这样用着,后面我回单独写一章博客来讲解的.

转发和重定向的区别

虽然二者最终实现的功能是相同的.但是还是有很大不同的.不同之处如下

  • 地址栏变化
    转发不会改变地址栏中的URL,而重定向则会改变
  • 跳转范围
    转发只能访问到当前web应用中的内容,而重定向则可以访问到任意web应用中的内容
  • request对象作用范围
    转发后,在转发后的页面中仍然可以使用原来的request对象,而重定向,原来的request对象则失去作用.

所以,如果想要在多个页面使用相同的request对象,那么只能使用转发,而不能使用重定向.
好了,以上就是全部要介绍的内容.servlet的生命周期是十分重要的,其他的只能靠动手实践才能很好的掌握,自己动动手敲出一个个好玩的例子吧!

结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗
邮箱:roobtyan@outlook.com
个人博客:http://roobtyan.cn
扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……
给大家准备了一份非常棒的JAVA的视频教程,从JAVA基础一直到JAVAWEB,还有非常强大的项目实战。
就在我的微信公众号里,回复java就可查看,免费的呦!

这里写图片描述

发表评论

电子邮件地址不会被公开。 必填项已用*标注