深入了解Servlet技术

Servlet中获取用户提交表单数据

 Servlet可以处理来自用户的请求,也可以获取用户的请求数据,获取这些数据后就可以执行相应的操作。

比如说常见的登录功能,一般会给用户提供一个表单,表单里面可以让用户输入账号和密码,点击提交到Servlet

就可以使用HttpServletRequestgetParameter方法得到用户提交的数据了。

下面我们来实现一个简单的登录功能。

首先新建一个web工程,取一个名字。

打开index.jsp,在body里面加一个登录表单,如下:

  <form>

  <table>

    <tr>

    <td>账号:</td>

    <td><input type="text" name="user_name"/></td>

    </tr>

    <tr>

    <td>密码:</td>

    <td><input type="password"name="user_password"/></td>

    </tr>

    <tr>

    <td><input type="submit" value="提交"/></td>

    <td><input type="reset" value="重置"/></td>

    </tr>

  </table>

 </form>

新建一个package专门存放Servlet

新建一个Servlet,取名LoginServlet,这时候我们应该在doGet()方法还是doPost()方法里面写我们的登录处理呢?

我们先来做doGet()方法。

在编码之前,我们需要想清楚程序的逻辑,对于登录来说,肯定需要得到用户的账号和密码,那么在这里,我们就得分别得到这两个数据。

  String user_name=request.getParameter("user_name");

   Stringuser_password=request.getParameter("user_password");

然后我们在控制台打印一下这两个值.

   System.out.println("用户名为: "+user_name);

   System.out.println("密码为:"+user_password);

在这里user_nameuser_password就是页面中input框的name属性。

我们假设用户名等于admin,密码等于123456时登录成功,登录失败,则给出重新登录的连接

  if(user_name.equals("admin")&&user_password.equals("123456") ){

    out.println("登录成功");

  }else{

  String path=request.getContextPath();

out.println("登录失败 <ahref='"+path+"/index.jsp'>重新登录</a>");

  }

 request.getContextPath()可以得到当前项目的路径

最后,我们把表单的action属性设置为此Servleturl

 <form action="servlet/LoginServlet">

至此,我们已经开发出一个简陋的登录功能,但是会发觉在网址的后面会跟上参数名和用户输入的值,诸如密码等敏感信息

已经暴露出来了,这是非常不安全的,而这正是由于formget提交方式造成的。

formmethod属性默认就是get的,所以我们必须手动设置成post方式。

 <form action="servlet/LoginServlet"method="post">

里面不写method默认的是get方式

由于此时是post提交,那么我们必须把判断登录的代码写到doPost方法里才行。

Servlet中读取自身初始化参数

  Servlet必须配置在web.xml中才可以使用,除了配置常规外,还有一些可选的配置供我们使用

  <servlet>

<servlet-name>LoginServlet</servlet-name>

<servlet-class>servlet.LoginServlet</servlet-class>

<init-param>

<param-name>message</param-name>

<param-value>workwith servlet</param-value>

</init-param>

<init-param>

<param-name>message1</param-name>

<param-value>servletis so important</param-value>

</init-param>

</servlet>

使用<init-param>标签可以定义一个初始化参数,这个标签有两个子标签:<param-name><param-value>

分别表示参数名和参数值。

在本例中,我们定义了两个初始化参数,那么使用ServletAPI有两种方式得到这些值

1Servlet自身的getInitParameter()方法

   String message = this.getInitParameter("message");

   String message1 = this.getInitParameter("message1");

   System.out.println("message: " + message);

   System.out.println("message1: " + message1);

2,可以使用ServletConfig对象来得到这些配置的参数值,这个对象由Servlet自身的getServletConfig()方法获取

   ServletConfig sc=this.getServletConfig();

   String message = sc.getInitParameter("message");

   String message1 =sc.getInitParameter("message1");

   System.out.println("message: " + message);

   System.out.println("message1: " + message1);

Servlet对象有一个getServletConfig()方法,此方法返回一个ServletConfig对象;

ServletConfiggetInitParameter()方法可以得到具体的参数值,方法里面需要传入配置过的参数名

我们之前讲过,Servlet的创建和初始化一般来说就是在用户第一次访问该Servlet时完成。但是我们可以通过配置来改变这种状况。

<load-on-startup>0</load-on-startup>

当不配置这个标签或者配置成负数时,Servlet会在第一次访问时创建并初始化;当把该值配置成>=0时,表示Servlet

会在web服务器启动时创建并初始化。对于多个Servlet来说,该值越大,启动优先级就越低。

Servlet中读取上下文参数

上面我们讲过的<init-param>标签,只能配置在某个Servlet中,也只能在该Servlet得到。假如说要配置一个全局的,能被所有Servlet得到该怎么做。

web.xml中配置上下文参数,可以让所有Servlet使用

 <context-param>

<param-name>webname</param-name>

<param-value>OASYSTEM</param-value>

 </context-param>

Servlet中,必须先获得当前Servlet的上下文对象

 ServletContext context=this.getServletContext();

然后通过这个上下文对象得到上下文参数

 String webname=context.getInitParameter("webname");

 System.out.println("webname: "+webname);