Java Web初级阶段

第一阶段:最基本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。

Java EE中新建Servlet

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

doGet方法的 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部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTMLXML或其他格式文档的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可以配置虚拟目录)