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 }
View Code

 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在调用的时候是不可见的

   eclipse选择保存就会自动编译
7.@WebServlet("/RegistServlet")
 该注解的作用等价于 在web.xml中配置的该servlet的<servlet-mapping>元素中<url-pattern>的配置
8.地址栏中输入http://localhost:8080/myservlet/hello       注意myservlet是project名字,hello是url映射的名字
9.getServletContext() 报错:在void init(ServletConfig config) throws ServletException 内添加 super.init(config);  // config
 

猜你喜欢

转载自www.cnblogs.com/sansuiwantong/p/12805992.html