第一阶段:最基本MVC实现——Java Bean + JSP + Servlet
Java Bean
Java Bean就是满足一种编程约定的类。规范如下:
- Java Bean类必须为 public, 类变量必须为 private
- 必须提供公共无参构造函数
- 每个属性(类变量)提供对应的读写方法(getter / setter方法)。对于 boolean 类型数据的读取,为is方法
- 实现Serializable接口
Q:为什么类变量必须通过对应的读取方法操作?
A:Java编程中要尽量避免对类变量的直接调用,以保障安全和向后兼容性。
Q: Serializable接口是什么? 为什么要实现Serializable?
A:
(1)public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
所谓的Serializable,就是java提供的通用数据保存和读取的接口。任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。
实现序列化接口的类可以通过ObjectOutputStream和ObjectInputStream操作。
实现Serializable接口的类可以定义 serialVersionUID ,serialVersionUID 用来辅助序列化和反序列化。对比文件中的 serialVersionUID 和本地实体类中的 serialVersionUID ,以此判断反序列化得到的类与当前类版本一致。
(2)并不是所有Java Bean类都要求必须实现Serializable。一般对需要被传输和持久保存的类,才实现Serializable接口。
Servlet
Java Servlet是运行在Web服务器上或应用服务器上的程序。可以作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上数据库或应用程序之间的中间层。Servlet为创建基于Web的应用程序提供了基于组件、独立于平台的方法。
Servlet不像CGI必须产生多进程来处理请求,当服务器启动时,Servlet就会被自动加载然后实例化并留存在内存中。当接收到请求时,服务器就会调用Servlet进行服务,对再次收到的相同请求,服务器会启动新的线程来处理数据。长时间不执行的Servlet会被服务器智能地从内存中移除。
生命周期
- Servlet 通过调用 init () 方法进行初始化
- Servlet 调用 service() 方法来处理客户端的请求
- Servlet 通过调用 destroy() 方法终止(结束)
- Servlet 由 JVM 的垃圾回收器进行回收
Servlet通常运行在容器中,如Tomcat。

新建servlet,修改response的内容,运行即可得到

最简单的只使用Servlet可以用来做哪些应用?
例如,我想模拟一个最简单Android应用的登录功能,需要由服务器验证用户输入的账号密码。那么可以在Android的登录Button内写响应事件,获取EditText内的数据后,用新线程建立HTTP连接,发送request至对应URL(服务器),然后POST数据。Tomcat作为Servlet容器,会调用Servlet服务,由Servlet获取参数并实现数据的处理(比如查询数据库取得密码进行比对)之后,再返回对应内容(是否成功)至手机。
//Android 与Servlet数据交互 private void requestUsingHttpURLConnection(){ new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("https://localhost:8080/Service/Servlet"); connection = (HttpURLConnection) url.openConnection(); // 打开该URL连接 connection.setUseCaches(false); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("POST"); // 设置请求方法,POST connection.setConnectTimeout(8000); // 设置连接建立的超时时间 connection.setReadTimeout(8000); // 设置网络报文收发超时时间 connection.connect(); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); String data = "account=123&password=123" //发送的数据,以&隔开 out.writeBytes(data); out.flush(); out.close(); InputStream in = connection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); String line = ""; StringBuilder response = new StringBuilder(); while ((line = bufferedReader.readLine())!=null){ response.append(line); } Message msg = new Message(); msg.what = 1; msg.obj = response.toString(); Log.e("Response", response.toString()); handler.sendMessage(msg); bufferedReader.close(); connection.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); }
PS. 像密码比对之类的功能要尽量避免传输密码明文,尽量哈希之后交由服务器比对。
JSP
全称Java Server Pages,JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
JSP可以理解成一种特殊的Servlet。用户第一次访问JSP时,JSP引擎把该文件转换成Servlet,生成字节码文件,执行jspInit()。jspService()方法来处理用户的请求,对每一个请求,JSP引擎创建新的线程处理该请求(直接调用jspService() )。由Servlet特点可知,Servlet是会实例化驻留在内存中的,因而响应速度还是很快的。
以下提供JSP的一个小栗子。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" import="java.text.*"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>这是一个JSP生成的页面。</h1> <hr> <!-- 这是 HTML 注释 --> <%-- 这是 JSP 注释 --%> <% out.println("这是println方法输出。"); %> <br> <%! String value = "价格"; int add(int x,int y){ return x+y; } %> 输出value的内容-><%= value %><br> x+y=<%= add(1,2) %><br> <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String d = sdf.format(new Date()); %> 今天是:<%= d %> </body> </html>

PS. Eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下的.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps中,tmp1文件夹里面存放着该项目的信息。 而IDEA通过File——>Project Structure——>Artifact——>Output directory可查看部署路径。(Tomcat可以配置虚拟目录)