使用参数和接收表单数据

获取请求参数:

  请求参数可分为两种:

    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:

    优点:当它修改时,只需重启应用就可以使配置文件生效,不需要重新编译应用程序

       它可以做一些注解无法完成的事情

    缺点:比较繁琐

原文地址:https://www.cnblogs.com/aristole/p/8001005.html