学习Servlet-day12

1.自定义标签

(1)编程步骤

step1.写一个java类,继承SimpleTagSupport类。
(简单标签支持类)
注:
    jsp标签技术有两种:
    复杂标签技术(old)
    简单标签技术(new)
step2.override doTag方法,在该方法里面,编写
    相应的处理逻辑。
step3.在标签的描述文件当中,描述该标签。

(2)标签的执行过程

step1.容器依据标签的命名空间找到标签的描述文件(.tld文件)。
step2.容器依据标签的名称找到标签类(
即知道标签类的类名),容器会将该标签类实例化。
step3.如果标签有属性,则容器会调用对应的set方法给这些属性赋值(即将标签的属性值赋给标签对象)。
step4.最后,容器会调用标签对象的doTag方法。

2.MVC (Model 模型 View 视图 Controller 控制器)

(1)MVC是什么?

是一种软件架构思想,其核心思想是,在设计一个
软件的时候,应该将软件划分成三种不同类型的模块,
分别是模型、视图和控制器。
模型用来封装业务逻辑,视图用来封装表示逻辑
(包括数据展现以及用户操作界面),控制器用来
协调模型和视图(视图将请求先发送给控制器,由
控制器选择合适的模型来处理;模型将处理结果也要先交给控制器,由控制器选择合适的视图来展现)。

(2)如何使用MVC?

在web开发当中,使用Servlet充当控制器,使用
java类充当模型,使用jsp充当视图。


(3)Servlet容器如何处理请求资源路径?

比如,在浏览器地址栏输入
http://ip:port/day12-2/abc.html
则请求资源路径是"/day12-2/abc.html"
step1.容器默认会认为访问的是一个servlet,
所以,去web.xml配置中,查找有无匹配的servlet。
匹配方式:
    精确匹配:
        要求<url-pattern>的值必须是
        "/abc.html"。
    通配符匹配:
        使用 * 号匹配零个或者多个任意字符
        <url-pattern>/*</url-pattern>
    后缀匹配:
        以*.开头,后接一个后缀(比如do,action
        之类的)
        <url-pattern>*.do</url-pattern>
        以上匹配,会匹配所有以.do结尾的请求。
step2.如果找不到匹配的servlet,则容器会查找
    对应的文件。

(4)一个Servlet处理多种请求

step1. 配置后缀匹配
step2. 分析请求资源路径,依据分析结果,
    进行不同的处理。


项目里建java文件

package tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * 	标签类:
 * 		a.继承SimpleTagSupport类。
 * 		b.override doTag方法,在该方法里面
 * 		写处理逻辑。
 * 		c.标签有哪些属性,标签类也要有对应的属性
 *		  (属性名要相同,类型要匹配,并且提供
 *			对应的set方法)。
 *		
 */
public class HelloTag extends SimpleTagSupport{
	private String msg;
	private int qty;
	
	public HelloTag(){
		System.out.println("HelloTag的构造器");
	}
	
	public void setMsg(String msg) {
		System.out.println(
				"HelloTag的setMsg方法 " + msg);
		this.msg = msg;
	}
	

	public void setQty(int qty) {
		System.out.println(
				"HelloTag的setQty方法 " + qty);
		this.qty = qty;
	}


	@Override
	public void doTag() throws JspException, IOException {
		System.out.println("HelloTag的doTag方法");
		/*
		 * 通过继承自SimpleTagSupport类提供的方法
		 * 来获得PageContext对象。
		 * 注:
		 * 	PageContext提供了获得其它所有隐含对象
		 * 的方法。
		 */
		PageContext pctx = 
				(PageContext)getJspContext();
		JspWriter out = pctx.getOut();
		
		for(int i = 0; i < qty; i ++){
	        out.println(msg + "<br/>"); 
	    }
	}
}


WEB-INF文件夹下面建

mytag.tld,注意后缀名

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
  <!-- 版本号,可以自定义 -->  
  <tlib-version>1.1</tlib-version>
  <!-- 命名空间的别名 -->
  <short-name>d</short-name>
  <!-- 命名空间 -->
  <uri>test</uri>
  
  <tag>
    <name>hello</name>
    <tag-class>tag.HelloTag</tag-class>
    <!-- 
    	body-content有三个值:
    	empty     该标签没有标签体。
    	scriptless  该标签有标签体,但是标签体的
    			内容不能够出现任何java代码。
    	JSP   该标签有标签体,并且,标签体的内容可以
    			出现java代码。但是,只有复杂标签技术
    			才支持该值。   
     -->
    <body-content>empty</body-content>
    <attribute>
        <name>msg</name>
        <!-- 
        	值为true,表示该属性是必选的,
        	即使用时,必须赋值。
         -->
        <required>true</required>
        <!-- 
        	值为true,表示该属性可以动态赋值
        	(即可以使用el表达式赋值)
         -->
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
    	<name>qty</name>
    	<required>true</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag> 
</taglib>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值