现在在JavaWeb开发中,倾向于将常量信息写于某个配置文件中,这样做好处是当需求变化时,只需要修改一下配置文件就可以了,不用修改源程序,不用重新编译,维护方便。
初始化参数(init-param)
初始化参数(init-param)位于web.xml文件的<servlet>标签下,一个Servlet可以配置0到多个初始化参数。
下面看一个例子:利用初始化参数(init-param)进行权限控制。
本实例存在四个页面:index.jsp(登录页面) ,InitParamServlet(权限判断),notice.html(放入/WEB-INF目录下,该目录下文件不能直接访问),web.xml文件(配置文件)。
index.jsp源码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登陆后查看机密文件</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="servlet/InitParamServlet" method="post">
登陆后查看机密文件<br>
<label>账号:</label>
<input type="text" name="username"><br>
<label>密码:</label>
<input type="password" name="userpw"><br>
<input type="submit" value="登录">
<p>悄悄告诉你:账号密码都是admin</p>
</form>
</body>
</html>
InitParamServlet源码:
package com.javaweb.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class InitParamServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String name = req.getParameter("username");
String passw = req.getParameter("userpw");
// 获取初始化参数方法 getInitParameterNames
Enumeration params = this.getInitParameterNames();
while(params.hasMoreElements()){
//获取初始化参数名 即用户名
String nameParam = (String) params.nextElement();
//获取密码 getInitParameter方法获取参数值
String passwParam = this.getInitParameter(nameParam);
if(name.equals(nameParam)&&passw.equals(passwParam)){
req.getRequestDispatcher("/WEB-INF/notice.html").forward(req, resp);
return;
}
}
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
notice.html源码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>这是一个机密网页</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
恭喜你,进入内部页面! <br>
此页面存放于<b>/WEB-INF</b> 下<br>
幸运的人,请点击<a href="http://codinghjy.coding.me">传送门</a>
</body>
</html>
web.xml配置源码:
<servlet>
<servlet-name>InitParamServlet</servlet-name>
<servlet-class>com.javaweb.servlet.InitParamServlet</servlet-class>
<!-- 初始参数列表 -->
<init-param>
<param-name>admin</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>codinghjy</param-name>
<param-value>codinghjy</param-value>
</init-param>
<init-param>
<param-name>123456</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>InitParamServlet</servlet-name>
<url-pattern>/servlet/InitParamServlet</url-pattern>
</servlet-mapping>
当我们需要控制用户权限时,可以直接在web.xml文件中进行增加和删除用户,不用修改源代码。
上下文参数(context- param)
初始化参数(init-param)只属于其servlet的参数,并不是全局参数,而上下文参数(context-param)属于全局参数,可以被所有servlet访问。
我们可以通过
ServletContext servletContext = getServletConfig().getServletContext();
获取上下文,然后使用
servletContext.getInitParameter("")
获取参数。