后端开发:【JavaWeb开发之Servlet的两种配置方式】

一、What.

Servlet 为何物?两种配置方式是什么?
复制代码

Servlet狭义指的就是一个叫做“Servlet”的接口,广义指实现了这个接口的Java程序,运行在服务端,用来处理任何类型的请求、扩展基于HTTP协议的Web服务器。 两种配置方式为XML标签式和注解式。

二、Why.

  编写Servlet为什么还要配置?
复制代码

当我们要开发编写一个针对请求的处理类,只实现Servlet接口是不行的。就像你造的酒很香,但是客人不知道去哪买一样。这是你要贴出标语、路标作为指示说明。类似的,你编写的“香喷喷”的Servlet实现类,也要配置说明下(“打个广告”),让外来的请求能够找到对应的处理类。

三、How.

 两种方式如何配置?
复制代码

知识点其实不多,但为了让我们学习知识更有兴趣,我们每练习一个Demo应该给它赋予一个场景需求。 本次Demo练习,我们用两种配置方式做一个Servlet相关的查看兑奖号码的例子。

(一)XML标签式配置.

在Servlet 3.0版本之前,Servlet的配置说明只能通过在WEB-INF 目录下的web.xml文件中添加标签的形式。

<web-app>
      <servlet>
        <!--servlet的昵称、代号,共下文中的引用-->
		<servlet-name>CheckNumber</servlet-name>

        <!--servlet对应的类文件,包名+类名-->
		<servlet-class>com.breaker.servlet.CheckServlet</servlet-class>

        <!--servlet内部的初始化参数,非必需配置-->
		<init-param>
			<param-name>user</param-name>
			<param-value>Breaker93</param-value>
		</init-param>
		<init-param>
			<param-name>my_jianshu_url</param-name>
			<param-value>http://www.jianshu.com/u/187408ee66d4</param-value>
		</init-param>

		<!--通知Servlet容器(“tomcat”)在启动的时候初始化创建该Servlet的实例,非必需配置 -->
		<load-on-startup>1</load-on-startup>

	</servlet>


	<servlet-mapping>

        <!--为代号为“CheckNumber”的Servlet设置浏览器访问地址(要与上文中的Serlet
        的代号名称一致,否则会找不到的),
        例如http://192.168.0.100:8080/DemoProject/checkNumber -->
		<servlet-name>CheckNumber</servlet-name>

        <!--此处的名称与servlet-name的值无关,随便设置的,
                  只为了浏览器中请求方便 -->
		<url-pattern>/checkNumber</url-pattern>

	</servlet-mapping>
</web-app>
复制代码

此种配置中的Servlet实现类是这样编写的:

//HttpServlet继承了GenericServlet类,GenericServlet继承了Servlet接口,
//他们都是Servlet API提供,非个人编写的;所以CheckServlet是间接实现的Servlet接口。
public class CheckServlet extends HttpServlet{
	
    //处理get请求,在此方法内编写处理逻辑。
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("我的简书链接:"+getServletConfig().getInitParameter("my_jianshu_url"));
		String[] number=req.getParameterValues("number");
		for(int i=0;i<7;i++){
			System.out.print(number[i]);
		}
		System.out.println("---------");
		String[] awardNum=new String[7];
		Random random=new Random();
		for(int i=0;i<7;i++){			
			awardNum[i] = random.nextInt(10)+"";
			System.out.print(awardNum[i]);
		}
		System.out.println("------");
		
		int count = 0,max = 0,position = 0;
		for(int i= 0;i<awardNum.length;i++){
			if(awardNum[i].equals(number[i])){
				count++;
				if (count>max) {
					position=i;
					max=count;
				}
			}else{
				count=0;
			}
		}
		req.setAttribute("number", number);
		req.setAttribute("awardNum", awardNum);
		req.setAttribute("bool", "");
		req.setAttribute("begin",8 );
		req.setAttribute("end", 8);
		String[] result = {"六等奖","五等奖","四等奖","三等奖","二等奖","一等奖"};
		if(max >1){
			req.setAttribute("bool", true);
			req.setAttribute("result","恭喜你中了" +result[max-2]);
			req.setAttribute("begin", position-max+1);
			req.setAttribute("end", position);
		}
		RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
		dispatcher.forward(req, resp); 
	}
	//处理post请求,在此方法内编写处理逻辑。
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
		System.out.println("doPost() executed");
	}
	
}
复制代码

Jsp页面中是这样请求的Servlet:

//checkNumber 与<url-pattern>/checkNumber</url-pattern>对应一致才能请求到;
//此种请求等同于action="http://127.0.0.1:8080/DemoProject/checkNumber"
<form  action="checkNumber">
	...
    ...	
</form>
复制代码

(二)注解式.

在Servlet 3.0版本之后,WEB-INF路径下的web.xml文件不再是必需的,但通常还是建议保留。提供的注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。

开发Servlet 3.0的程序需要一定的环境支持。Servlet3是Java EE6规范的一部分,Tomcat需要Tomcat7才支持Java EE6,Tomcat7需要使用JDK6。

直接在Servlet实现类里配置:

//HttpServlet继承了GenericServlet类,GenericServlet继承了Servlet接口,
//他们都是Servlet API提供,非个人编写的;所以CheckServlet是间接实现的Servlet接口。

/*@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。
*&emsp;  @WebServlet有很多的属性:
*&emsp;  asyncSupported:   声明Servlet是否支持异步操作模式。
*&emsp;&emsp;description:&emsp;&emsp;  Servlet的描述。
*&emsp;&emsp;displayName:     Servlet的显示名称。
*&emsp;&emsp;initParams:        Servlet的init参数。
*&emsp;&emsp;name:&emsp;&emsp;&emsp;&emsp;    Servlet的名称。
*&emsp;&emsp;urlPatterns:&emsp;&emsp;  Servlet的访问URL。
*&emsp;&emsp;value:&emsp;&emsp;&emsp;       Servlet的访问URL。
*
*&emsp;&emsp;Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
*   例如:@WebServlet(name="AnnotationServlet",value="/AnnotationServlet")。
*
*&emsp;&emsp;也可以定义多个URL访问:
*&emsp;&emsp;如@WebServlet(name="AnnotationServlet",urlPatterns={"/AnnotationServlet","/AnnotationServlet2"})
*&emsp;&emsp;或者@WebServlet(name="AnnotationServlet",value={"/AnnotationServlet","/AnnotationServlet2"})
*/
@WebServlet(name="CheckNumber",urlPatterns={"/checkNumber"},initParams= {@WebInitParam(name = "my_jianshu_url", value = "http://www.jianshu.com/u/187408ee66d4")},loadOnStartup = 1)
public class CheckServlet extends HttpServlet{
	
    //处理get请求,在此方法内编写处理逻辑。
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("我的简书链接:"+getServletConfig().getInitParameter("my_jianshu_url"));
		String[] number=req.getParameterValues("number");
		for(int i=0;i<7;i++){
			System.out.print(number[i]);
		}
		System.out.println("---------");
		String[] awardNum=new String[7];
		Random random=new Random();
		for(int i=0;i<7;i++){
			
			awardNum[i] = random.nextInt(10)+"";
			System.out.print(awardNum[i]);
		}
		System.out.println("------");
		
		int count = 0,max = 0,position = 0;
		for(int i= 0;i<awardNum.length;i++){
			if(awardNum[i].equals(number[i])){
				count++;
				if (count>max) {
					position=i;
					max=count;
				}
			}else{
				count=0;
			}
		}
		req.setAttribute("number", number);
		req.setAttribute("awardNum", awardNum);
		req.setAttribute("bool", "");
		req.setAttribute("begin",8 );
		req.setAttribute("end", 8);
		String[] result = {"六等奖","五等奖","四等奖","三等奖","二等奖","一等奖"};
		if(max >1){
			req.setAttribute("bool", true);
			req.setAttribute("result","恭喜你中了" +result[max-2]);
			req.setAttribute("begin", position-max+1);
			req.setAttribute("end", position);
		}
		RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
		dispatcher.forward(req, resp); 
	}
	//处理post请求,在此方法内编写处理逻辑。
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
		System.out.println("doPost() executed");
	}
	
}
复制代码

四、Summary.

  • 两种配置方式不要混用,避免出现同时配置@WebServlet注解标记和web.xml中等标签的现象。
  • 两种配置方式比较: XML配置形式,在需要修改Servlet的配置信息(比如初始化参数的值)时,只需在服务器访问目录直接修改web.xml文件而不需要修改java文件然后再重新编译成class文件; 但是当web.xml文件中出现大量的Servlet配置时,就会显得冗杂,而注解方式让配置更方便、简练。

本节Demo源码GitHub下载: https://github.com/Breaker-93/Demo0923breaker_Servlet.git 若有疑问、请留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值