学习servlet中如何使用参数和接收表单提交
获取请求参数:
请求参数可分为两种:
1.查询参数,它直接显示在请求URL上,例如:http://localhost:8080/Hello-User/greeting?user=radiam,其中user就是请求参数
2.请求正文,参数被包含在post请求中,这些参数可以通过web开发者工具进行查看
例子:获取单值请求参数
package cn.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//使用注解部署servlet
@WebServlet(
name = "helloServlet",
urlPatterns = {"/greeting", "/salutation", "/wazzup"},
loadOnStartup = 1
)
public class HelloServlet extends HttpServlet{
// 设置一个默认的用户名
private static final String DEFAULT_USER = "Guest";
/*
* 功能:
* 检测请求中是否带有user参数,若没有,就使用常量值
* 设置响应内容的类型和字符编码
* 从响应中获得一个PrintWriter,并输出一个html文档
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求参数中的user
String user = req.getParameter("user");
if(user == null)
user = HelloServlet.DEFAULT_USER;
// 设置响应内容的类型是html文本
resp.setContentType("text/html");
// 设置响应内容的字符编码为utf-8
resp.setCharacterEncoding("utf-8");
// 获得响应的字符输出流
PrintWriter writer = resp.getWriter();
// 向字符输出流中输入html文本
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Hello User Application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/>\r\n")
.append(" <form action=\"greeting\" method=\"post\" >\r\n")
.append(" Entry your name: <br/>\r\n")
.append(" <input type=\"text\" name=\"user\" />\r\n")
.append(" <input type=\"submit\" value=\"Submit\" />\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
}
/*
* 处理以post方法提交的表单
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 简单地把任务委托给doGet()方法
this.doGet(req, resp);
}
}
例子:获取多值请求参数
package cn.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 接收多值参数
*/
@WebServlet(
name = "multivalueParameterServlet",
urlPatterns = {"/checkbox"}
)
public class MultiValueParameterServlet extends HttpServlet{
/*
* 创建一个html页面,询问用户喜欢哪些水果
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容的类型和字符编码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
// 获得响应的PrintWriter对象
PrintWriter writer = resp.getWriter();
// 往输出流输入html文本
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Hello User Application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" <form action=\"checkbox\" method=\"post\" />\r\n")
.append(" Selection the fruits you like to eat:<br/>\r\n")
.append(" <input type=\"checkbox\" name=\"fruit\" value=\"Banana\" /> Banana <br/>\r\n")
.append(" <input type=\"checkbox\" name=\"fruit\" value=\"Orange\" /> Orange <br/> \r\n")
.append(" <input type=\"checkbox\" name=\"fruit\" value=\"Guava\" /> Guava <br/> \r\n")
.append(" <input type=\"checkbox\" name=\"fruit\" value=\"Kiwi\" /> Kiwi <br/> \r\n")
.append(" <input type=\"submit\" value=\"submit\" />\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
}
/*
* 处理用户提交的表单
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 从请求正文中获得复选框中的选择
String[] fruits = req.getParameterValues("fruit");
//设置响应内容的类型和字符编码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
// 获得响应的PrintWriter对象
PrintWriter writer = resp.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Hello User Application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" <h2>Your Selections</h2> \r\n");
if(fruits == null)
writer.append(" You did not select any fruits \r\n");
else{
writer.append(" <ul> \r\n");
for(String fruit : fruits){
writer.append(" <li>").append(fruit).append("</li> \r\n");
}
writer.append(" </ul>\r\n");
}
writer.append(" </body>\r\n")
.append("</html>\r\n");
}
}
使用初始化参数配置应用程序:
有两种方式:
1.使用上下文初始化参数,结果是:在servlet的任何地方都可以轻松获得这些初始化参数,它们不是某个servlet特有的,应用程序中的所有servlet都共享这些参数,可通过ServletContext对象调用getInitParameter(name)获得
2.使用servlet初始化参数,结果是:这些参数是某个servlet特有的,可以从ServletConfig对象调用 getInitParameter(name) 获得,无需经过ServletContext对象
例子:获取上下文初始化参数:
/*
* 获取上下文初始化参数
*/
@WebServlet(
name = "contextParameterServlet",
urlPatterns = {"/contextParameter"}
)
public class ContextParameterServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext context = this.getServletContext();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.append("settingOne: ").append(context.getInitParameter("settingOne"))
.append(", settingTwo: ").append(context.getInitParameter("settingTwo"));
}
}
在web.xml中配置
<!--
使用上下文初始化参数,在这里的两个参数在Servlet代码的任何地方都可以轻松地访问和使用
-->
<context-param>
<param-name>settingOne</param-name>
<param-value>foo</param-value>
</context-param>
<context-param>
<param-name>settingTwo</param-name>
<param-value>bar</param-value>
</context-param>
例子:使用Servlet初始化参数
/*
* 获取Servlet初始化参数,该参数是某个serlvet特有的,可以从ServletConfig对象中获取
*/
@WebServlet(
name = "servletParameterServlet",
urlPatterns = {"/servletParameters"},
initParams = {
@WebInitParam(name = "database", value = "CustomerSupport"),
@WebInitParam(name = "server", value = "10.0.12.5")
}
)
public class ServletParameterServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletConfig对象
ServletConfig config = this.getServletConfig();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.append("database: ").append(config.getInitParameter("database"))
.append(", server: ").append(config.getInitParameter("server"));
}
}
其中注解部分也可以在web.xml中配置,如下:
<servlet>
<servlet-name>servletParameterServlet</servlet-name>
<servlet-class>cn.exampke.ServletParameterServlet</servlet-class>
<init-param>
<param-name>database</param-name>
<param-value>CustomerSupport</param-value>
</init-param>
<init-param>
<param-name>server</param-name>
<param-value>10.0.12.5</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletParameterServlet</servlet-name>
<url-pattern>/servletParameters</url-pattern>
</servlet-mapping>
使用注解和部署文件配置servlet的比较:
1.使用注解:
优点:避免xml配置,非常直接和简洁;
缺点:当它修改时,需要重新编译应用程序;
有些事情它不能办到,比如:创建单个servlet的多个实例,安排过滤器的执行顺序
2.使用web.xml:
优点:当它修改时,只需重启应用就可以使配置文件生效,不需要重新编译应用程序
它可以做一些注解无法完成的事情
缺点:比较繁琐