祥解WEB应用的部署文件web.xml

本文详细介绍了web.xml配置文件的各个元素及其作用,包括上下文参数、过滤器、监听器等,并提供了具体的示例说明。
æ¬æä½¿ç¨çæå¡å¨æ¯Tomcatæå¡å¨ï¼Webåºç¨åå¸æè¿°æä»¶web.xmlæ¯å¨Servletè§è中å®ä¹çãweb.xmlå­æ¾å¨WEB-INF/ç®å½ä¸
    å¨åæweb.xmlææ¡£ä¹åææ³å说ä¸ä¸web.xml中根åç´ <web-app>åå­åç´ ç顺åºé®é¢ï¼å ä¸ºå¨web.xml中åç´ å®ä¹çååé¡ºåºæ¯ä¸è½é¢ åçï¼é¤é å¨web.xmlæä»¶ä¸­ä½¿ç¨XML Schemaï¼æ¬æä¸å讨论ï¼ï¼å¦åTomcatæå¡å¨å¯è½æåºSAXParseExceptionã
    顺åºå¦ä¸ï¼
                      <web-app>
                      <display-name>
                      <description>
                      <distributable>
                      <context-param>
                      <filter>
                      <filter-mapping>
                     <listener>
                      <servlet>
                      <servlet-mapping>
                      <session-config>
                      <mime-mapping>
                      <welcome-file-list>
                      <error-page>
                      <taglib>
                     <resource-env-ref>
                      <resource-ref>
                      <security-constraint>
                      <login-config>
                      <security-role>
                      <env-entry>
                      <ejb-ref>
                      <ejb-local-ref>
web.xml中çå¼å¤´å è¡æ¯åºå®çï¼å®å®ä¹äºè¯¥æä»¶çå­ç¬¦ç¼ç ï¼XMLçæ¬ä»¥åå¼ç¨çDTDæä»¶ã
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " http://java.sun.com/dtd/web-app_2_3.dtd">

å¨web.xml中顶å±å素为<web-app>ï¼å¶ä»ææçå­åç´ é½å¿é¡»å®ä¹å¨<web-app>å

<display-name>åç´ å®ä¹è¿ä¸ªwebåºç¨çåå­ï¼Java Web æå¡å¨çWeb管çå·¥å·å°ç¨è¿ä¸ªåå­æ¥æ å¿Webåºç¨ã

<description>åç´ ç¨æ¥å£°æWebåºç¨çæè¿°ä¿¡æ¯

<context-param>åç´ ç¨æ¥éç½®å¤é¨å¼ç¨çï¼å¨servlet䏭妿è¦è·å¾è¯¥å素中éç½®çå¼ï¼String param-value = getServletContext().getInitParameter("param-name")

<filter>
        <filter-name>SampleFilter</filter-name>
        <filter-class>com.lpdev.SampleFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>SampleFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
</filter-mapping>
以䏿¯éç½®äºä¸ä¸ªservletè¿æ»¤å¨ï¼å¯¹äºservlet容卿¶å°ç客æ·è¯·æ±ä»¥åååºçååºç»æï¼servleté½è½æ£æ¥åä¿®æ¹å¶ä¸­çä¿¡æ¯ï¼ä»¥ä¸ä»£ç æåå½å®¢æ·è¯·æ±è®¿é®Webåºç¨ä¸­çææJSPæä»¶æ¶ï¼å°è§¦åSampleFilterè¿æ»¤å¨å·¥ä½ï¼å·ä½çè¿æ»¤äºå¡å¨ç±<filter-class>中æå®çç±»æ¥å®æ

 <servlet>
  <servlet-name>IncludeServlet</servlet-name>
  <servlet-class>com.lpdev.IncludeServlet</servlet-class>
  
  <init-param>
     <param-name>copyright</param-name>
     <param-value>/foot.jspf</param-value>
     <load-on-startup>1</load-on-startup>
  </init-param>
 </servlet>
éç½®Servletï¼<servlet-name>æ¯servletçåå­ï¼<servlet-class>æ¯å®ç°è¿ä¸ªServletçç±»ï¼<init-param>å®ä¹Servletçåå§ååæ°ï¼åæ°åååæ°å¼ï¼ï¼ä¸ä¸ªServletå¯ä»¥æå¤ä¸ª<init-param>ï¼å¨Servlet类中éè¿getInitParameter(String name)æ¹æ³è®¿é®åå§ååæ°

 <servlet-mapping>
  <servlet-name>IncludeServlet</servlet-name>
  <url-pattern>/IncludeServlet</url-pattern>
 </servlet-mapping>
éç½®Servletæ å°ï¼<servlet-mapping>åç´ ç¨æ¥è®¾å®å®¢æ·è®¿é®æä¸ªServletçURLï¼è¿éåªéç»åºå¯¹äºæ´ä¸ªwebåºç¨çç¸å¯¹çURLè·¯å¾ï¼<url-pattern>中ç“/”表示å¼å§äºWebåºç¨çæ ¹ç®å½ä¾å¦ï¼å¦æä½ å¨ä½ æ¬å°æºå¨ä¸ä½¿ç¨Tomcat4.1.xï¼å¹¶ä¸å建äºå为“myapp”çåºç¨ç¨åºï¼<url-pattern>/IncludeServlet</url-pattern>该Servletç宿´webå°åå°±æ¯http://localhost:8080/myapp/IncludeServlet

<session-config>åç´ ç¨æ¥è®¾å®HttpSessionççå½å¨æï¼è¯¥åç´ åªæä¸ä¸ª<session-timeout>屿§ï¼æ¶é´å使¯“ç§”ã

<welcome-file-list>å½ç¨æ·è®¿é®webæ¶ï¼å¦æä»ä»ç»åºwebåºç¨çRoot URLï¼æ²¡ææå®å·ä½æä»¶åï¼å®¹å¨è°ç¨è¯¥éç½®ï¼è¯¥åç´ å¯ä»¥åå«å¤ä¸ª<welcome-file>屿§ã

<taglib>åç´ ç¨æ¥è®¾ç½®webå¼ç¨çtag library,ä¾ç¤ºå®ä¹äºä¸ä¸ª“/mytaglib”æ ç­¾åºï¼å®å¯¹åºçtldæä»¶ä¸ºï¼/WEB_INF/mytaglib.tld
<taglib>
    <taglib-url>/mytaglib</taglib-url>
    <taglib-locationg>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>

<resource-ref>妿webåºç¨ç±Servlet容å¨ç®¡ççæä¸ªJNDI Resourceï¼å¿é¡»å¨web.xml中声æå¯¹è¿ä¸ªJNDI Resourceçå¼ç¨ã
<resource-ref>
    <description>DB Connection</description> //说æ
    <res-ref-name>jdbc/sampleDB</res-ref-name> //å¼ç¨èµæºçJNDIåå­
    <res-type>javax.sql.DataSource</res-type> //å¼ç¨èµæºçç±»åå­
    <res-auth>Container</res-auth> //管çå¼ç¨èµæºçManager
</resource-ref>

<security-constraint>ç¨æ¥ä¸ºWebåºç¨å®ä¹å®å¨çº¦æ
 <security-constraint>
    <web-resource-collection>//声æåä¿æ¤çwebèµæº
       <web-resource-name>ResourceServlet</web-resource-name>//æ è¯åä¿æ¤webèµæº
       <url-pattern>/ResourceServlet</url-pattern>//æå®åä¿æ¤çURLè·¯å¾
       <http-method>GET</http-method>//æå®åä¿æ¤çæ¹æ³
       <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>//å¯ä»¥è®¿é®åä¿æ¤èµæºçè§è²
       <description>this applies only to admin secrity role</description>
       <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
       <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
 </security-constraint>

<login-config>åç´ æå®å½Web客æ·è®¿é®åä¿æ¤èµæºæ¶ï¼ç³»ç»å¼¹åºçç»éå¯¹è¯æ¡çç±»åãä¾ç¤ºéç½®äºåºäºè¡¨åéªè¯çç»éçé¢
<login-config>
    <auth-method>FORM</auth-method>//BASIC(åºæ¬éªè¯æ³)ï¼DIGEST(æè¦éªè¯)ï¼FORM(表åéªè¯)
    <real-name>设å®å®å¨åçåç§°</realname>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>

<security-role>ææè¿ä¸ªWebåºç¨å¼ç¨çææè§è²åå­
<security-role>
    <description>æè¿°</description>
    <role-name>admin</role-name>
</security-role>

module key_module( input clk_24mhz, // 24MHz输入时钟 input rst_n, // ä&frac12;Žç”µå¹³å¤ä&frac12; input key_start, // 开始按键(ä&frac12;Žç”µå¹³æœ‰æ•ˆï¼‰ input key_pause, // 暂停按键(ä&frac12;Žç”µå¹³æœ‰æ•ˆï¼‰ output reg start_en, // 开始ä&frac12;¿èƒ&frac12;(高电平有效) output reg pause_en // 暂停ä&frac12;¿èƒ&frac12;(高电平有效) ); // 按键消抖参数定义(20ms消抖,24MHz时钟下计数480_000次) parameter DEBOUNCE_CNT = 24'd480_000; // 内部寄存器定义 reg [23:0] cnt_start; // 开始键消抖计数器 reg [23:0] cnt_pause; // 暂停键消抖计数器 reg key_start_sync; // 开始键同步信号 reg key_pause_sync; // 暂停键同步信号 reg key_start_sync2; // 开始键二次同步信号 reg key_pause_sync2; // 暂停键二次同步信号 reg start_flag; // 开始键触发标志 reg pause_flag; // 暂停键触发标志 // 第一步:按键信号同步(消除跨时钟域 metastability) always @(posedge clk_24mhz or negedge rst_n) begin if(!rst_n) begin key_start_sync <= 1'b1; key_start_sync2 <= 1'b1; key_pause_sync <= 1'b1; key_pause_sync2 <= 1'b1; end else begin key_start_sync <= key_start; key_start_sync2 <= key_start_sync; key_pause_sync <= key_pause; key_pause_sync2 <= key_pause_sync; end end // 第二步:开始键消抖计数 always @(posedge clk_24mhz or negedge rst_n) begin if(!rst_n) begin cnt_start <= 24'd0; start_flag <= 1'b0; end else if(key_start_sync2 == 1'b0) begin // 按键按下(ä&frac12;Žç”µå¹³ï¼‰ cnt_start <= cnt_start + 24'd1; if(cnt_start == DEBOUNCE_CNT - 24'd1) begin start_flag <= 1'b1; // 消抖完成,ç&frac12;®è§¦å‘标志 end end else begin // 按键释放(高电平) cnt_start <= 24'd0; start_flag <= 1'b0; end end // 第三步:暂停键消抖计数 always @(posedge clk_24mhz or negedge rst_n) begin if(!rst_n) begin cnt_pause <= 24'd0; pause_flag <= 1'b0; end else if(key_pause_sync2 == 1'b0) begin // 按键按下(ä&frac12;Žç”µå¹³ï¼‰ cnt_pause <= cnt_pause + 24'd1; if(cnt_pause == DEBOUNCE_CNT - 24'd1) begin pause_flag <= 1'b1; // 消抖完成,ç&frac12;®è§¦å‘标志 end end else begin // 按键释放(高电平) cnt_pause <= 24'd0; pause_flag <= 1'b0; end end // 第四步:输出ä&frac12;¿èƒ&frac12;信号(单次触发,保持1个时钟周期) always @(posedge clk_24mhz or negedge rst_n) begin if(!rst_n) begin start_en <= 1'b0; pause_en <= 1'b0; end else begin start_en <= start_flag; // 开始ä&frac12;¿èƒ&frac12;随触发标志ç&frac12;®1 pause_en <= pause_flag; // 暂停ä&frac12;¿èƒ&frac12;随触发标志ç&frac12;®1 end end endmodule module music_player( input clk_24mhz, // 24MHz输入时钟 input rst_n, // ä&frac12;Žç”µå¹³å¤ä&frac12; input start_en, // 开始ä&frac12;¿èƒ&frac12;(高电平触发) input pause_en, // 暂停ä&frac12;¿èƒ&frac12;(高电平触发) output reg buzz, // 蜂鸣器驱动信号 output reg play_flag // 新增:播放状态标志输出 ); // 1. 音乐参数定义(音调-频率对应表,参数名SO_4保持统一) parameter DO_4 = 19'd45863; // 中音1(523.3Hz) parameter RE_4 = 19'd40816; // 中音2(587.3Hz) parameter MI_4 = 19'd36410; // 中音3(659.3Hz) parameter FA_4 = 19'd34014; // 中音4(698.5Hz) parameter SO_4 = 19'd30303; // 中音5(784.0Hz)——参数名定义为SO_4 parameter LA_4 = 19'd27027; // 中音6(880.0Hz) parameter SI_4 = 19'd24242; // 中音7(987.8Hz) parameter REST = 19'd0; // 休止符(无声音) // 音长定义(4Hz节拍,0.25秒/节拍) parameter BEAT_1 = 24'd6_000_000; // 1拍(0.25秒) parameter BEAT_2 = 24'd12_000_000; // 2拍(0.5秒) // 2. 《小星星》乐谱初始化(修复SOL_4为SO_4,与参数名一致) wire [18:0] tone_table [15:0]; // 音调表 wire [23:0] beat_table [15:0]; // 音长表 assign tone_table[0] = DO_4; assign beat_table[0] = BEAT_1; assign tone_table[1] = DO_4; assign beat_table[1] = BEAT_1; assign tone_table[2] = SO_4; assign beat_table[2] = BEAT_1; // 修正为SO_4 assign tone_table[3] = SO_4; assign beat_table[3] = BEAT_1; // 修正为SO_4 assign tone_table[4] = LA_4; assign beat_table[4] = BEAT_1; assign tone_table[5] = LA_4; assign beat_table[5] = BEAT_1; assign tone_table[6] = SO_4; assign beat_table[6] = BEAT_2; // 修正为SO_4 assign tone_table[7] = MI_4; assign beat_table[7] = BEAT_1; assign tone_table[8] = MI_4; assign beat_table[8] = BEAT_1; assign tone_table[9] = LA_4; assign beat_table[9] = BEAT_1; assign tone_table[10] = LA_4; assign beat_table[10] = BEAT_1; assign tone_table[11] = SO_4; assign beat_table[11] = BEAT_1; // 原SOL_4修正为SO_4 assign tone_table[12] = SO_4; assign beat_table[12] = BEAT_1; // 原SOL_4修正为SO_4 assign tone_table[13] = MI_4; assign beat_table[13] = BEAT_2; assign tone_table[14] = REST; assign beat_table[14] = BEAT_2; assign tone_table[15] = REST; assign beat_table[15] = BEAT_2; // 后续内部寄存器定义、播放状态控制、频率生成逻辑保持不变... // (此处省略与错误无关的代码,与原代码一致) endmodule module buzzer_music_top( input clk_24mhz, // 24MHz输入时钟 input rst_n, // ä&frac12;Žç”µå¹³å¤ä&frac12; input key_start, // 开始按键(ä&frac12;Žç”µå¹³æœ‰æ•ˆï¼‰ input key_pause, // 暂停按键(ä&frac12;Žç”µå¹³æœ‰æ•ˆï¼‰ output buzz, // 蜂鸣器驱动信号 output play_flag // 新增:播放状态标志输出(来自music_player) ); // 内部信号定义 wire start_en; // 按键模块输出的开始ä&frac12;¿èƒ&frac12; wire pause_en; // 按键模块输出的暂停ä&frac12;¿èƒ&frac12; // 模块例化:按键模块(不变) key_module u_key_module( .clk_24mhz(clk_24mhz), .rst_n(rst_n), .key_start(key_start), .key_pause(key_pause), .start_en(start_en), .pause_en(pause_en) ); // 模块例化:音乐播放模块(添加play_flag输出连接) music_player u_music_player( .clk_24mhz(clk_24mhz), .rst_n(rst_n), .start_en(start_en), .pause_en(pause_en), .buzz(buzz), .play_flag(play_flag) // 连接播放状态标志 ); endmodule备注此代码
最新发布
11-18
var Login = function() { var handleLogin = function() { $('.login-form').validate({ errorElement: 'span', //default input error message container errorClass: 'help-block', // default input error message class focusInvalid: false, // do not focus the last invalid input rules: { username: { required: true }, password: { required: true }, remember: { required: false } }, messages: { username: { required: "用户名必须输入." }, password: { required: "密码必须输入." } }, invalidHandler: function(event, validator) { //display error alert on form submit $(".alert-danger").find("span").html(validator.errorList[0].message); $('.alert-danger', $('.login-form')).show(); //显示信息 }, highlight: function(element) { // hightlight error inputs $(element) .closest('.form-group').addClass('has-error'); // set error class to the control group }, success: function(label) { label.closest('.form-group').removeClass('has-error'); label.remove(); }, errorPlacement: function(error, element) { error.insertAfter(element.closest('.input-icon')); }, submitHandler: function(form) { // form.submit(); // form validation success, call ajax form submit //ajax请求 进入如果成功登陆则跳è&frac12;¬åˆ°åŸºæœ¬é¡µé¢ } }); $('.login-form input').keypress(function(e) { if (e.which == 13) { $("#bt_login").click(); return false; } }); $("#bt_login").click(function(){ $('.alert-danger', $('.login-form')).hide(); // if ($('.login-form').validate().form()) { $.ajax({ type: "POST", url: $('.login-form').attr("action"), data:{username:$("#username").val(),password:$("#password").val()}, dataType:"json", timeout:5000, success:function(result){ if(isSuccess(result)){ //登å&frac12;•成功 è·³è&frac12;¬åˆ°é¡µé¢ location.href=base_path+"/gateway_do/modal/dashboard"; }else{ $(".alert-danger").find("span").html("用户登å&frac12;•失败!"); $('.alert-danger', $('.login-form')).show(); //显示信息 } }, error:function(request, status, err) { $(".alert-danger").find("span").html("用户登å&frac12;•失败!"); $('.alert-danger', $('.login-form')).show(); //显示信息 } }); } }); } var handleForgetPassword = function() { $('.forget-form').validate({ errorElement: 'span', //default input error message container errorClass: 'help-block', // default input error message class focusInvalid: false, // do not focus the last invalid input ignore: "", rules: { email: { required: true, email: true, } }, messages: { email: { required: "Email is required." } }, invalidHandler: function(event, validator) { //display error alert on form submit }, highlight: function(element) { // hightlight error inputs $(element) .closest('.form-group').addClass('has-error'); // set error class to the control group }, success: function(label) { label.closest('.form-group').removeClass('has-error'); label.remove(); }, errorPlacement: function(error, element) { error.insertAfter(element.closest('.input-icon')); }, submitHandler: function(form) { form.submit(); } }); $('.forget-form input').keypress(function(e) { if (e.which == 13) { if ($('.forget-form').validate().form()) { $('.forget-form').submit(); } return false; } }); jQuery('#forget-password').click(function() { jQuery('.login-form').hide(); jQuery('.forget-form').show(); }); jQuery('#back-btn').click(function() { jQuery('.login-form').show(); jQuery('.forget-form').hide(); }); } var handleRegister = function() { function format(state) { if (!state.id) { return state.text; } var $state = $( '<span><img src="../assets/global/img/flags/' + state.element.value.toLowerCase() + '.png" class="img-flag" /> ' + state.text + '</span>' ); return $state; } if (jQuery().select2 && $('#country_list').size() > 0) { $("#country_list").select2({ placeholder: '<i class="fa fa-map-marker"></i> Select a Country', templateResult: format, templateSelection: format, width: 'auto', escapeMarkup: function(m) { return m; } }); $('#country_list').change(function() { $('.register-form').validate().element($(this)); //revalidate the chosen dropdown value and show error or success message for the input }); } $('.register-form').validate({ errorElement: 'span', //default input error message container errorClass: 'help-block', // default input error message class focusInvalid: false, // do not focus the last invalid input ignore: "", rules: { fullname: { required: true }, email: { required: true, email: true }, address: { required: true }, city: { required: true }, country: { required: true }, username: { required: true }, password: { required: true }, rpassword: { equalTo: "#register_password" }, tnc: { required: true } }, messages: { // custom messages for radio buttons and checkboxes tnc: { required: "Please accept TNC first." } }, invalidHandler: function(event, validator) { //display error alert on form submit }, highlight: function(element) { // hightlight error inputs $(element) .closest('.form-group').addClass('has-error'); // set error class to the control group }, success: function(label) { label.closest('.form-group').removeClass('has-error'); label.remove(); }, errorPlacement: function(error, element) { if (element.attr("name") == "tnc") { // insert checkbox errors after the container error.insertAfter($('#register_tnc_error')); } else if (element.closest('.input-icon').size() === 1) { error.insertAfter(element.closest('.input-icon')); } else { error.insertAfter(element); } }, submitHandler: function(form) { form.submit(); } }); $('.register-form input').keypress(function(e) { if (e.which == 13) { if ($('.register-form').validate().form()) { $('.register-form').submit(); } return false; } }); jQuery('#register-btn').click(function() { jQuery('.login-form').hide(); jQuery('.register-form').show(); }); jQuery('#register-back-btn').click(function() { jQuery('.login-form').show(); jQuery('.register-form').hide(); }); } return { //main function to initiate the module init: function() { handleLogin(); handleForgetPassword(); handleRegister(); } }; }(); jQuery(document).ready(function() { Login.init(); });帮我分析一下有æ&sup2;¡æœ‰æ¼æ´ž
07-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值