Tomcat+JSP经典配置实例

本文介绍如何安装配置JDK和Tomcat,并详细说明部署JSP应用、Servlet及使用JavaBean的过程。

ãç»å¸¸çå°jspçåå­¦èé®tomcatä¸å¦ä½éç½®jspãservletåbeançé®é¢ï¼äºæ¯æ»ç»äºä¸ä¸å¦ä½tomcatä¸éç½®jspãservletåbenï¼å¸æå¯¹é£äºåå­¦èææå¸®å©ã

ä¸ãå¼åç¯å¢éç½®

ç¬¬ä¸æ­¥ï¼ä¸è½½j2sdkåtomcatï¼å°sun宿¹ç«ï¼http://java.sun.com/j2se/1.5.0/download.jspï¼ä¸è½½j2sdkï¼æ³¨æä¸è½½çæ¬ä¸ºWindows Offline InstallationçSDKï¼åæ¶æå¥½ä¸è½½J2SE 1.5.0 Documentationï¼ç¶åå°tomcat宿¹ç«ç¹ï¼http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgiï¼ä¸è½½tomcatï¼ä¸è½½ææ°5.5.9çæ¬çtomcatï¼ï¼

ç¬¬äºæ­¥ï¼å®è£åé置你çj2sdkåtomcatï¼æ§è¡j2sdkåtomcatçå®è£ç¨åºï¼ç¶åæé»è®¤è®¾ç½®è¿è¡å®è£å³å¯ã

1.å®è£j2sdk以åï¼éè¦éç½®ä¸ä¸ç¯å¢åéï¼å¨æççµè->屿§->é«çº§->ç¯å¢åé->ç³»ç»åé中添å ä»¥ä¸ç¯å¢åé(åå®ä½ çj2sdkå®è£å¨c:\j2sdk1.5.0ï¼ï¼

JAVA_HOME=c:\j2sdk1.5.0
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;ï¼.;ä¸å®ä¸è½å°ï¼å ä¸ºå®ä»£è¡¨å½åè·¯å¾)
path=%JAVA_HOME%\bin

æ¥çå¯ä»¥åä¸ä¸ªç®åçjavaç¨åºæ¥æµè¯J2SDKæ¯å¦å·²å®è£æåï¼

public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}

å°ä¸é¢çè¿æ®µç¨åºä¿å­ä¸ºæä»¶å为Test.javaçæä»¶ã

ç¶åæå¼å½ä»¤æç¤ºç¬¦çªå£ï¼cdå°ä½ çTest.javaæå¨ç®å½ï¼ç¶åé®å¥ä¸é¢çå½ä»¤

javac Test.java
java Test

æ­¤æ¶å¦æçå°æå°åºæ¥This is a test program.çè¯è¯´æå®è£æåäºï¼å¦ææ²¡ææå°åºè¿å¥è¯ï¼ä½ éè¦ä»ç»æ£æ¥ä¸ä¸ä½ çéç½®æåµã

2.å®è£Tomcatåï¼å¨æççµè->屿§->é«çº§->ç¯å¢åé->ç³»ç»åé中添å ä»¥ä¸ç¯å¢åé(åå®ä½ çtomcatå®è£å¨c:\tomcat)ï¼

CATALINA_HOME=c:\tomcat
CATALINA_BASE=c:\tomcat

ç¶åä¿®æ¹ç¯å¢åé中çclasspathï¼ætomatå®è£ç®å½ä¸çcommon\libä¸ç(å¯ä»¥æ ¹æ®å®é追å )servlet.jar追å å°classpath中å»ï¼ä¿®æ¹åçclasspathå¦ä¸ï¼

classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;

æ¥çå¯ä»¥å¯å¨tomcatï¼å¨IE中访é®http://localhost:8080ï¼å¦æçå°tomcatçæ¬¢è¿é¡µé¢çè¯è¯´æå®è£æåäºã

ç¬¬ä¸æ­¥ï¼å»ºç«èªå·±çjsp appç®å½

1.å°Tomcatçå®è£ç®å½çwebappsç®å½ï¼å¯ä»¥çå°ROOTï¼examples, tomcat-docsä¹ç±»Tomcatèªå¸¦ççç®å½ï¼
2.å¨webappsç®å½ä¸æ°å»ºä¸ä¸ªç®å½ï¼èµ·åå«myappï¼
3.myapp䏿°å»ºä¸ä¸ªç®å½WEB-INFï¼æ³¨æï¼ç®å½åç§°æ¯åºå大å°åçï¼
4.WEB-INF䏿°å»ºä¸ä¸ªæä»¶web.xmlï¼å容å¦ä¸ï¼

<?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-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>

5.å¨myapp䏿°å»ºä¸ä¸ªæµè¯çjsp页é¢ï¼æä»¶å为index.jspï¼æä»¶å容å¦ä¸ï¼
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>

6.éå¯Tomcat

7.æå¼æµè§å¨ï¼è¾å¥http://localhost:8080/myapp/index.jsp çå°å½åæ¶é´çè¯è¯´æå°±æåäºã

ç¬¬åæ­¥ï¼å»ºç«èªå·±çServletï¼

1.ç¨ä½ æçæçç¼è¾å¨ï¼å»ºè®®ä½¿ç¨æè¯­æ³æ£æ¥çjava ideï¼æ°å»ºä¸ä¸ªservletç¨åºï¼æä»¶å为Test.javaï¼æä»¶å容å¦ä¸ï¼

package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html><body><h1>This is a servlet test.</h1></body></html>");
out.flush();
}
}

2 .ç¼è¯
å°Test.javaæ¾å¨c:\testä¸ï¼ä½¿ç¨å¦ä¸å½ä»¤ç¼è¯ï¼

C:\Test>javac Test.java

ç¶åå¨c:\Testä¸ä¼äº§çä¸ä¸ªç¼è¯åçservletæä»¶ï¼Test.class

3 .å°ç»ætest\Test.classåªåå°%CATALINA_HOME%\webapps\myapp\WEB-INF\classesä¸ï¼ä¹å°±æ¯åªåé£ä¸ªtestç®å½å°classesç®å½ä¸ï¼å¦æclassesç®å½ä¸å­å¨ï¼å°±æ°å»ºä¸ä¸ªã ç°å¨webapps\myapp\WEB-INF\classes䏿test\Test.classçæä»¶ç®å½ç»æ

4 .ä¿®æ¹webapps\myapp\WEB-INF\web.xmlï¼æ·»å servletåservlet-mapping

ç¼è¾åçweb.xmlå¦ä¸æç¤ºï¼çº¢è²ä¸ºæ·»å çå容:

<?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-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description>A test Servlet</description>
<servlet-class>test.Test</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>

</web-app>

è¿æ®µè¯ä¸­çservletè¿ä¸æ®µå£°æäºä½ è¦è°ç¨çServletï¼èservlet-mapping忝å°å£°æçservlet"æ å°"å°å°å/Testä¸

5 .好äºï¼éå¯å¨Tomcatï¼å¯å¨æµè§å¨ï¼è¾å¥http://localhost:8080/myapp/Test 妿çå°è¾åºThis is a servlet test.就说æç¼åçservletæåäºã

注æï¼ä¿®æ¹äºweb.xml以忰å äºclassï¼é½è¦éå¯Tomcat

ç¬¬åæ­¥ï¼å»ºç«èªå·±çBeanï¼

1.ç¨ä½ æçæçç¼è¾å¨ï¼å»ºè®®ä½¿ç¨æè¯­æ³æ£æ¥çjava ideï¼æ°å»ºä¸ä¸ªjavaç¨åºï¼æä»¶å为TestBean.javaï¼æä»¶å容å¦ä¸ï¼

package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}

2 .ç¼è¯

å°TestBean.javaæ¾å¨c:\testä¸ï¼ä½¿ç¨å¦ä¸å½ä»¤ç¼è¯ï¼

C:\Test>javac TestBean.java

ç¶åå¨c:\Testä¸ä¼äº§çä¸ä¸ªç¼è¯åçbeanæä»¶ï¼TestBean.class

3 .å°TestBean.classæä»¶åªåå° %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\testä¸ï¼

4 .æ°å»ºä¸ä¸ªTestBean.jspæä»¶ï¼æä»¶å容为ï¼

<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>

5 .好äºï¼éå¯Tomcatï¼å¯å¨æµè§å¨ï¼è¾å¥http://localhost:8080/myapp/TestBean.jsp 妿çå°è¾åºJava bean name is: This is a test java bean.就说æç¼åçBeanæåäºã

è¿æ ·å°±å®æäºæ´ä¸ªTomcatä¸çjspãservletåjavabeançéç½®ãæ¥ä¸æ¥éè¦åçäºæå°±æ¯å¤ç书ãå¤è¯»å«äººç好代ç ï¼èªå·±å¤å¨æå代ç ä»¥å¢å¼ºèªå·±å¨è¿æ¹é¢å¼åçè½åäºã

jvmåºå¡«åå°
c:\j2sdk\bin

ç»ä½ ä¸ä¸ªç®åçéç½®ï¼ï¼ï¼ï¼

JSPç¯å¢éç½®å¿å¾

é¦åè¦è¯´çæ¯ï¼ä½¿ç¨jdk+tomcatå®å¨å¯ä»¥éç½®æä»¬çjspæå¡å¨ï¼ä¸åéè¦å¶å®ä»»ä½ä¸ä¸ï¼æå¾å¤æç« ä»ç»äºApacheï¼å¶å®æ ¹æ¬ç¨ä¸çï¼ä¸è¬ç学习è°è¯tomcatå®å¨å¯ä»¥èä»»äºã

å®è£jdkåï¼tomcatå¨å®è£ä¹åä¼èªå¨æ¾å°jdkçå®è£è·¯å¾ï¼ä¸è·¯ç¹å»"ä¸ä¸æ­¥"ï¼ç»è¿ä¸æ®µæ¶é´çæä»¶å¤å¶ï¼æå"close"ï¼å®æcomcatçå®è£ã

æ¨æå¥½å»ä¸è½½ä¸ä¸ªçæ¬è¾é«çtomcatï¼æ¯å¦4.1以ä¸çï¼å ä¸ºå®ä¸éè¦è®¾ç½®å¤ªå¤çç³»ç»åéï¼å³å»"æççµè"ï¼éæ©"屿§"->"é«çº§"->"ç¯å¢åé"->"ç³»ç»åé"ï¼æ°å»ºä¸ä¸ªTOMCAT_HOMEï¼å¼è®¾ç½®æä½ çtomcatæå¨çè·¯å¾ï¼æ¯å¦ï¼D:\Program Files\Apache Group\Tomcat 5.5ï¼éç½®å®æã

ä»å¼å§èå中æ¾å°tomcaté项ï¼ä¸è¬æå¼é¡ºåºæ¯ï¼å¼å§->ç¨åº->Apache Tomcat 5.5ï¼éæ©"Start Tomcat"ï¼è®©jspæå¡å¨å¼å§è¿è¡ï¼æ­¤æ¶ä¼æå¼ä¸ä¸ªç±»ä¼¼Dosççªå£ï¼ä¼æ¾ç¤ºä¸äºç¸å³çä¿¡æ¯ã

妿æ¨ä½¿ç¨ä»£çä¸ç½ï¼ä¸å®è¦åæ¤æä»£çï¼ä¸ç¶æ¨çjspç¨åºæ°¸è¿ä¹å¾ä¸å°æ§è¡ã妿䏿¯ä»£ççï¼è¿ä¸æ­¥å°±è·³è¿äºã

æå¼æµè§å¨ï¼å¨å°åæ ä¸­è¾å¥ï¼http://localhost:8080ï¼å¦æçå°æèèï¼æä¹ä¸ç¥éæ¯èèè¿æ¯ç«ï¼çç»é¢ï¼æ­åæ¨ï¼æ¨æåäºä¸åã

åæ¥äº«åä¸ä¸æåç忦å§ï¼è¯·è¾å¥ä¸é¢ç代ç ï¼

<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is: h
<%= new java.util.Date() %>
</H3>
</body>
</html>

å°è¯¥ç¨åºä¿å­ä¸º:First.jspï¼æ¾å°TomcatçROOTç®å½ä¸ï¼ç¶å卿µè§å¨çå°åæ ä¸­è¾å¥ï¼http://localhost:8080/First.jspï¼(First.jspè·æä»¬ä¿å­çæä»¶åç大å°åè¦ä¸è´)å车ï¼å¦æä¸åºæå¤ï¼åºè¯¥å¯ä»¥çå°å½¢å¦Today is: h Fri Apr 11 08:32:38 CST 2003 çç»æã

注æï¼ROOTæ¯tomcatçé»è®¤èæç®å½ï¼å¦æè¦æ¹æèªå·±çèæç®å½æä¹åå¢ï¼è¯·ç»§ç»­å¾ä¸çå§ã

è¦æ¹æèªå·±çèæç®å½ï¼å°±è¦è¯·åºserver.xmlæ¥äºï¼è¯¥æä»¶æ¯ä¸ä¸ªéç½®æä»¶ï¼å¨Tomcat\confç®å½ä¸ï¼ä½¿ç¨ä»»ä½ææ¬ç¼è¾è½¯ä»¶é½è½æå¼å®ï¼æä»¬åæ¾å°ä¸é¢ä¸å¥ï¼

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />

è¿éçport="8080"å°±æ¯ç«¯å£ï¼æä»¬å®å¨å¯ä»¥ç¨å«çç«¯å£æ¥ä»£æ¿ï¼ä½ä¸è½æ¯è¢«ç³»ç»å ç¨ç端å£ï¼0--1023ï¼ï¼è¿éç®åæä¸ä¸ã

ä¸é¢æä»¬åå¾ä¸æ¾ï¼ä¼åç°ä»¥ä¸ç语å¥ï¼

</Context>
</Host>

æä»¬å°±åºè¯¥æ¾å°è¿ä¸¤ä¸ªè¯­å¥ï¼å¦æä¸æEæï¼æ¨å°±è®¤å®è¿ä¸¤ä¸ªè¯­å¥å¥½äºãç¶åæä»¬å°è¯¥è¯­å¥æ´æ¹å¦ä¸ï¼

</Context>
<Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true">
</Context>
</Host>

è¿éçpath="/myjsp"å°±æ¯æä»¬å°±éç½®çèæç®å½äºï¼ä»¥åå¨å°åæ ä¸­è¾å¥http://localhost:8080/myjspå³å¯ãèdocBase="e:/myjsp" 忝æºå¨æ¬å°è·¯å¾ï¼ä»ä»¬éè¿è¿ä¸ªè¯­å¥å½¢æä¸ä¸ªæ å°å³ç³»ï¼å¶å®ç§æã

å°ä¸é¢çFirst.jspæä»¶æ¾å°e:/myjspç®å½ä¸ï¼è¾å¥http://localhost:8080/myjsp/First.jspï¼æ¯ä¸æ¯æä¸ç§åä¸ç梢çæè§ï¼

å¨è®ºåéæè§å¾æå¤çå°±æ¯å¾å¤äººä¸ç¥éjavaBeanæä»¶æ¾å°åªéï¼èå®è¯´å¼å§æä¹ä¸ç¥éï¼æ´ä»¤äººä¸è§£çæ¯ï¼å个人æä¹ç§ä¸åç说æ³ï¼è¿æ´è®©æä»¬è«ç¶ãå¶å®è¿é®é¢ä¹ä¸æ¯æä»¬æ³åçé£ä¹å¤æï¼æä»¬ä»¥ä¸ä¸ªä¾å­è¯´æï¼

å建ç«ä¸ä¸ªjavaç¨åºï¼ä»£ç å¦ä¸ï¼

package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}

ä¿å­ä¸ºSimpleBean.javaï¼ç¼è¯åä¼çæä¸ä¸ªåï¼å¶å®å°±ç¸å½äºä¸ä¸ªç®å½ï¼ä¹å°±æ¯SimpleBean.classä¼å­æ¾å¨hallç®å½ä¸­ï¼æä¸ä¿å­èµ·æ¥ï¼å°æ¥å¤ç¨ã

åè¾å¥ä»¥ä¸ä»£ç ï¼

<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message" value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>

ä¿å­å¨æä»¬åæå»ºç«çèæç®å½e:/myjspä¸é¢ï¼å¹¶å½å为ï¼BeanTest.jspã

ç°å¨æä»¬åºè¯¥å°hallï¼åï¼ç®å½æ¾å¨åªå¿å¢ï¼å«æ¥ï¼æä»¬åå¨e:/myjspä¸å»ºç«ä¸ä¸ªæä»¶å¤¹WEB-INFï¼ç¶ååå¨WEB-INFä¸å»ºç«ä¸ä¸ªclassesæä»¶å¤¹ï¼æåå°hallç®å½æ¾å°classesä¸ï¼å½ç¶ï¼hallä¸çå­èç æä»¶SimpleBean.classä¹ä¸å¹¶è¦ç§»è¿æ¥ï¼èSimpleBean.javaå°±åBeanTest.jspæ¾å°åä¸ç®å½å§ï¼å¯ä»¥ä¸éè¦æ¾çï¼èªå·±è¯è¯ï¼ã

éæ°å¯å¨æºå¨ï¼å¦ææ¨è¯äºå¥½å¤æ¬¡é½ä¸è¡ï¼è¿ä¸æ­¥ä¸å®è¦åï¼ï¼å¨æµè§å¨ä¸­è¾å¥ï¼http://localhost:8080/myjsp/BeanTest.jspï¼æ¨çå°äºä»ä¹ï¼åµï¼å«åè¯ææ¨ä»ä¹é½æ²¡çå°ï¼é£è¯å®æ¯æ¨è®¾ç½®çé®é¢äºã

module key_module( input clk_24mhz, // 24MHz输入时钟 input rst_n, // 低电平复位 input key_start, // 开始按键(低电平有效) input key_pause, // 暂停按键(低电平有效) output reg start_en, // 开始使能(高电平有效) output reg pause_en // 暂停使能(高电平有效) ); // 按键消抖参数定义(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 // 按键按下(低电平) cnt_start <= cnt_start + 24'd1; if(cnt_start == DEBOUNCE_CNT - 24'd1) begin start_flag <= 1'b1; // 消抖完成,置触发标志 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 // 按键按下(低电平) cnt_pause <= cnt_pause + 24'd1; if(cnt_pause == DEBOUNCE_CNT - 24'd1) begin pause_flag <= 1'b1; // 消抖完成,置触发标志 end end else begin // 按键释放(高电平) cnt_pause <= 24'd0; pause_flag <= 1'b0; end end // 第四步:输出使能信号(单次触发,保持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; // 开始使能随触发标志置1 pause_en <= pause_flag; // 暂停使能随触发标志置1 end end endmodule module music_player( input clk_24mhz, // 24MHz输入时钟 input rst_n, // 低电平复位 input start_en, // 开始使能(高电平触发) input pause_en, // 暂停使能(高电平触发) 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, // 低电平复位 input key_start, // 开始按键(低电平有效) input key_pause, // 暂停按键(低电平有效) output buzz, // 蜂鸣器驱动信号 output play_flag // 新增:播放状态标志输出(来自music_player) ); // 内部信号定义 wire start_en; // 按键模块输出的开始使能 wire pause_en; // 按键模块输出的暂停使能 // 模块例化:按键模块(不变) 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
module Video_Image_Processor #( parameter [10:0] IMG_HDISP = 10'd640, //640*480 parameter [10:0] IMG_VDISP = 10'd480 ) ( //global clock input clk , input rst_n , //来自摄像头的当前帧 input per_frame_vsync , input per_frame_href , input per_frame_clken , input [7:0] per_img_red , input [7:0] per_img_green , input [7:0] per_img_blue , //将当前帧转成灰度数据输出,用于缓存到SDRAM output YCbCr_frame_vsync , output YCbCr_frame_href , output YCbCr_frame_clken , output [7:0] YCbCr_img_Y_current , //来自SDRAM的前一帧灰度图像 input [7:0] YCbCr_img_Y_previous, //输出帧差运动目标检测之后的结果 output post_frame_vsync , output post_frame_href , output post_frame_clken , output [7:0] post_img_red , output [7:0] post_img_green , output [7:0] post_img_blue , //debug PIC1 帧差之后的结果 output PIC1_frame_vsync , output PIC1_frame_href , output PIC1_frame_clken , output PIC1_img_Bit , //debug PIC2 腐蚀膨胀之后的结果 output PIC2_frame_vsync , output PIC2_frame_href , output PIC2_frame_clken , output PIC2_img_Bit , //user interface input [7:0] user_Threshold , // 帧差阈值 input [9:0] MIN_DIST , // 多目标之间的最小间距 output [19:0] seg_data );这是我的代码帮忙修改
03-15
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请求 进入如果成功登陆则跳转到基本页面 } }); $('.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)){ //登录成功 跳转到页面 location.href=base_path+"/gateway_do/modal/dashboard"; }else{ $(".alert-danger").find("span").html("用户登录失败!"); $('.alert-danger', $('.login-form')).show(); //显示信息 } }, error:function(request, status, err) { $(".alert-danger").find("span").html("用户登录失败!"); $('.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(); });帮我分析一下有没有漏洞
07-13
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值