深入了解Servlet技术
Servlet中获取用户提交表单数据
Servlet可以处理来自用户的请求,也可以获取用户的请求数据,获取这些数据后就可以执行相应的操作。
比如说常见的登录功能,一般会给用户提供一个表单,表单里面可以让用户输入账号和密码,点击提交到Servlet,
就可以使用HttpServletRequest的getParameter方法得到用户提交的数据了。
下面我们来实现一个简单的登录功能。
首先新建一个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_name和user_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属性设置为此Servlet的url
<form action="servlet/LoginServlet">
至此,我们已经开发出一个简陋的登录功能,但是会发觉在网址的后面会跟上参数名和用户输入的值,诸如密码等敏感信息
已经暴露出来了,这是非常不安全的,而这正是由于form的get提交方式造成的。
form的method属性默认就是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>
分别表示参数名和参数值。
在本例中,我们定义了两个初始化参数,那么使用Servlet的API有两种方式得到这些值:
1,Servlet自身的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对象;
ServletConfig的getInitParameter()方法可以得到具体的参数值,方法里面需要传入配置过的参数名
我们之前讲过,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);