MVC模式(下)--- Servlet + JSP+Web
1. View :web ; Control: Servlet; Model: MVC模式(上)中的model;
2.代码:
2.1 Jsp
1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2 pageEncoding="ISO-8859-1"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5 <jsp:useBean id="beatModel" scope="request" class="DJView.BeatModel" /> <!-- class 需要放包里,默认报错 --> 6 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 10 <title>Insert title here</title> 11 </head> 12 <body> 13 <body> 14 <form method="get" action="/DJViewWeb/DJViewServlet"> 15 Get BPM: <input type=text name="bpm" value="<jsp:getProperty name='beatModel' property='BPM' />"> 16 </form> 17 18 <form method="get" action="/DJViewWeb/DJViewServlet"> 19 <input type="submit" name="bpm" value="testGetBpm" /> 20 </form> 21 22 <form method="post" action="/DJViewWeb/DJViewServlet"> 23 <input type="submit" name="set" value="testPost" /> 24 </form> 25 26 <a href="http://localhost:8080/DJViewWeb/DJViewServlet">http://localhost:8080/DJViewWeb/DJViewServlet</a> 27 28 <form method="post" action="/DJViewWeb/DJViewServlet"> <!-- action 要写对 --> 29 <input type="submit" name=on value="start" /> 30 <input type="submit" name=off value="stop" /> 31 </form> 32 33 </body> 34 </html>
2.2 Servlet
1 import java.io.IOException; 2 3 import javax.servlet.ServletConfig; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.*; 10 11 import DJView.BeatModel; 12 /** 13 * Servlet implementation class DJViewServlet 14 */ 15 //not need set in web.xml use @WebServlet 16 @WebServlet("/DJViewServlet") 17 public class DJViewServlet extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#HttpServlet() 22 */ 23 public DJViewServlet() { 24 super(); 25 // TODO Auto-generated constructor stub 26 } 27 28 /** 29 * @see Servlet#init(ServletConfig) 30 */ 31 public void init(ServletConfig config) throws ServletException { 32 // TODO Auto-generated method stub 33 super.init(config); //must add,or getServletContext() throws ServletException 34 BeatModel beatModel = new BeatModel(); 35 beatModel.initialize(); 36 getServletContext().setAttribute("beatModel", beatModel); 37 } 38 39 /** 40 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 41 */ 42 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 43 // TODO Auto-generated method stub 44 System.out.println("------------ receive get"); 45 BeatModel viewModel = (BeatModel)getServletContext().getAttribute("beatModel"); 46 47 String bpm = request.getParameter("bpm"); 48 bpm = viewModel.getBPM() + ""; 49 System.out.println("bmp:" + bpm); 50 51 request.setAttribute("beatModel", viewModel); 52 53 RequestDispatcher dispatcher = request.getRequestDispatcher("/djview.jsp"); 54 dispatcher.forward(request, response); 55 } 56 57 /** 58 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 59 */ 60 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 61 // TODO Auto-generated method stub 62 System.out.println("------------ receive post"); 63 64 BeatModel viewModel = (BeatModel)getServletContext().getAttribute("beatModel"); 65 66 String on = request.getParameter("on"); 67 if(on!=null) 68 viewModel.on(); 69 70 String off = request.getParameter("off"); 71 if(off!=null) 72 viewModel.off(); 73 74 RequestDispatcher dispatcher = request.getRequestDispatcher("/djview.jsp"); 75 dispatcher.forward(request, response); 76 } 77 78 }
2.3 Model

1 package DJView; 2 3 import java.util.*; 4 import javax.sound.midi.*; 5 6 interface BeatObserver { 7 void updateBeat(); 8 } 9 interface BPMObserver { 10 void updateBPM(); 11 } 12 interface BeatModelInterface{ 13 void initialize(); 14 void on(); 15 void off(); 16 17 void setBPM(int bpm); 18 int getBPM(); 19 20 void registerObserver(BeatObserver o); 21 void removeObserver (BeatObserver o); 22 23 void registerObserver(BPMObserver o); 24 void removeObserver (BPMObserver o); 25 } 26 27 public class BeatModel implements BeatModelInterface,MetaEventListener{ 28 Sequencer sequencer; 29 Sequence sequence; 30 Track track; 31 32 ArrayList<BeatObserver> beatObservers = new ArrayList<BeatObserver>(); 33 ArrayList<BPMObserver> bpmObservers = new ArrayList<BPMObserver>(); 34 int bpm = 90; 35 36 public void initialize(){ 37 setUpMidi(); 38 buildTrackAndStart(); 39 } 40 public void on(){ 41 System.out.println("Starting the sequencer"); 42 sequencer.start(); 43 setBPM(85); 44 } 45 46 public void off(){ 47 setBPM(0); 48 sequencer.stop(); 49 } 50 public void setBPM(int bpm){ 51 this.bpm = bpm; 52 sequencer.setTempoInBPM(getBPM()); 53 notifyBPMObservers(); 54 } 55 public int getBPM(){ 56 return bpm; 57 } 58 59 void beatEvent() { 60 notifyBeatObservers(); 61 } 62 public void registerObserver(BeatObserver o) { 63 beatObservers.add(o); 64 } 65 66 public void notifyBeatObservers() { 67 for(int i = 0; i < beatObservers.size(); i++) { 68 BeatObserver observer = (BeatObserver)beatObservers.get(i); 69 observer.updateBeat(); 70 } 71 } 72 73 public void registerObserver(BPMObserver o) { 74 bpmObservers.add(o); 75 } 76 77 public void notifyBPMObservers() { 78 for(int i = 0; i < bpmObservers.size(); i++) { 79 BPMObserver observer = (BPMObserver)bpmObservers.get(i); 80 observer.updateBPM(); 81 } 82 } 83 public void removeObserver(BPMObserver o){ 84 int i = bpmObservers.indexOf(o); 85 if(i >= 0) 86 bpmObservers.remove(i); 87 } 88 public void removeObserver(BeatObserver o) { 89 int i = beatObservers.indexOf(o); 90 if (i >= 0) { 91 beatObservers.remove(i); 92 } 93 } 94 95 public void meta(MetaMessage message) { 96 97 if (message.getType() == 47) { 98 beatEvent(); 99 sequencer.setMicrosecondPosition(0); //without it do not work 100 sequencer.start(); 101 setBPM(getBPM()); 102 } 103 } 104 105 public void setUpMidi(){ 106 try{ 107 sequencer = MidiSystem.getSequencer(); 108 sequencer.open(); 109 sequencer.addMetaEventListener(this); 110 sequence = new Sequence(Sequence.PPQ,4); 111 track = sequence.createTrack(); 112 sequencer.setTempoInBPM(getBPM()); 113 //sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);//it continuous but not receive event 114 }catch(Exception e){ 115 e.printStackTrace(); 116 } 117 } 118 public void buildTrackAndStart() { 119 int[] trackList = {35, 0, 46, 0}; 120 121 sequence.deleteTrack(null); 122 track = sequence.createTrack(); 123 124 makeTracks(trackList); 125 track.add(makeEvent(192,9,1,0,4)); 126 try { 127 sequencer.setSequence(sequence); 128 } catch(Exception e) { 129 e.printStackTrace(); 130 } 131 } 132 public void makeTracks(int[] list) { 133 134 for (int i = 0; i < list.length; i++) { 135 int key = list[i]; 136 137 if (key != 0) { 138 track.add(makeEvent(144,9,key, 100, i)); 139 track.add(makeEvent(128,9,key, 100, i+1)); 140 } 141 } 142 } 143 public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) { 144 MidiEvent event = null; 145 try { 146 ShortMessage a = new ShortMessage(); 147 a.setMessage(comd, chan, one, two); 148 event = new MidiEvent(a, tick); 149 } catch(Exception e) { 150 e.printStackTrace(); 151 } 152 return event; 153 } 154 }
3.执行(Eclipse)
4.telnet 测试
1 telnet localhost 8080 2 Ctrl+] 3 Enter 4 GET /DJViewWeb/DJViewServlet HTTP/1.0 5 Enter
4.工程源码:运行往往卡在工程配置上,eclipse打开,见附文件DJViewWeb.rar
https://files.cnblogs.com/files/sansuiwantong/DJViewWeb.rar
5.杂记:
1.servlet-api: 复制tomcat服务器目录下lib目录中的servlet-api.jar文件,复制到之前配置好的%JAVA_HOME%\jre\lib\ext\下
2.JSP(JavaServer Page)服务器端 嵌入式脚本语言,JSP代码被编译成servlet,寄居在JavaServer引擎(或具备类似功能)使用;
JSP从ASCII文本编译成Java字节码;Web服务器你能够缓存,调试时停止服务器,手工删除编译过页面,防止老的JSP
3.servlet 只能在web服务上的Servlet容器内运行,浏览器能从Servlet发送请求和接收响应。
Servlet 可以连接在一起,通过特殊的标记 和 Java代码 扩展html形式的页面
4.serialVersionUID 是 Java 为每个序列化类产生的版本标识,可用来保证在反序列时,发送方发送的和接受方接收的是可兼容的对象
若不显式定义 serialVersionUID 的值,Java 会根据类细节自动生成 serialVersionUID 的值,如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化
5.RequestDispatcher 代表请求的派发者。它有2个动作:forward 和 include 。客户端对于任何一个请求,可以根据业务逻辑需要,选择不同的处理办法:
请求的是谁,谁就自己处理并响应,例如请求的是一个html,则web浏览器显示的就是这个HTML的内容。
使用RequestDispatcher让其它的资源参与进来,协同完成的响应,这就是RequestDispatcher的主要作用。
6.javabean的类名要和源文件的名称一致且必须是public,不然编译出来的*.class在调用的时候是不可见的
该注解的作用等价于 在web.xml中配置的该servlet的<servlet-mapping>元素中<url-pattern>的配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通