JavaEE学习笔记——1、Basic knowledge

时间:2022-11-01 07:18:54

1、Web基础(20130222)

1)HTML&CSS&HTTP

HTML(Hyper Text Markup Language),是一种标记语言(非编程语言),被用来描述网页。

CSS(Cascading Style Sheets),是w3c在html4.0开始(为了解决内容与表现分离)加入的。

HTML 标签原本被设计为用于定义文档内容。通过使用 <h1>、<p>、<table> 这样的标签,HTML 的初衷是表达“这是标题”、“这是段落”、“这是表格”之类的信息。同时文档布局由浏览器来完成,而不使用任何的格式化标签。现在文档布局由CSS完成。

HTTP(Hyper Text Transfer Protocol)(相对于ISO参考模型)是应用层协议,是一个基于请求/响应(request/repsonse based)模式的,无状态(stateless)的协议。

HTTP一次通讯过程(Browser<==>Server):建立连接、发送请求、服务器响应、服务器关闭连接。

早期的Web,网页较为简单(传输量小),每次建立连接不会造成很大开销。但由于css、javascript的兴起,使得网页越来越复杂(传输量大),建立连接变成一种负担。

于是HTTP1.1中,给出一个持续连接(Persistent Connections)的机制,并将其作为HTTP1.1版本的缺省行为。即一次连接,多次请求&多次响应,关闭连接。

HTTP&TELNET都是基于TCP,试用TELNET远程连接Server:

cmd==>telnet www.sina.com.cn 80==>copy请求内容==>得到Server响应

请求内容如下:

GET /index.html HTTP/1.1

Host:www.sina.com.cn

若把GET换成HEAD,响应内容就仅获得头信息。

通过这一方式能加深对http的理解,接下来试试自己建立tomcat server,然后通过这一方式对自建的server进行请求。

2)了解Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。

Tomcat是一个轻量级应用服务器,在很多中小型访问量不是很大的场合被普遍使用。

Tomcat的主要目录:

bin:二进制可执行文件

conf:配置文件

lib:运行所需的库文件

logs:日志

temp:临时文件

webapps:应用部署文件

work:存放编译后应用的工作目录

使用前需要配置JRE,这里可以使用JRE标准配置(见JavaSE学习笔记基础),也可以使用TOMCAT的配置(CATALINA_HOME=tomcat所在目录、JAVA_HOME=JDK安装目录)。

启动tomcat/bin/shutup.bat,通过cmd中telnet命令查看index头信息。

HEAD / HTTP/1.1
Host:localhost
Connection:Keep-Alive(持续连接,若想关闭连接可换成close)

在掌握了Web基础知识后,就可以开始Java Web开发了。



2、初识JSP&Servlet

1)简介

Java Web开发主要需要掌握两种技术:JSP、Servlet。

JSP&Servlet是Java Server端编程,主要运行在Server端,Server有很多种,比如(轻量级)Tomcat、Resin、Jetty、(重量级)Weblogic、Webshpere、JBoss等。

Tomcat仅能运行Servlet、JSP,所以也称为Servlet服务器(或容器),而像JBoss称为应用服务器,可以运行EJB等。

使用Eclipse开发时,若更换工作目录,可能丢失一些首选项配置,若想保留可打开以前的工作目录,通过以下操作导出:File==>Except==>General==>Preferences==>Except All==>To Preferences File==>Finish。

这一方法也支持Eclipse到MyEclipse之间的首选项互导。

2)第一个JSP页面“Hello World!”

(1)服务器部署:在Eclipse中部署Tomcat与创建新项目类似,通过new==>Server==>Apache==>Tomcat添加Tomcat Server。这样做的主要目的是为了创建项目时Target Runtime能引用Tomcat。

(2)创建项目:new==>Dynamic Web Project,Target Runtime项选择Tomcat。

(3)创建JSP页面:在WebContent下new==>JSP File。

(4)启动项目:有两种方式,一种可以借助在server.xml加入content标签指定在webapps以外的目录部署项目,另一种则是使用Eclipse发布项目。

(5)访问项目:打开Browser,输入http://localhost:8080/projectname/就会以缺省自动向下的方式访问index.html或index.jsp。

Remark:

在webapps以外的地方部署项目配置:打开conf/server.xml,在</Host>标签前,加上<Context path="/projectname" docBase="X:\projectname\WebRoot" reloadable="true"/>,此配置意在将docBase(physic path)映射到path(logic path),reloadable为true时,文件修改自动重新部署(无需重启Server)。

web.xml是一个核心配置文件,称为deployment descriptor,将会在Servlet开发中用到。

3)第一个Servlet程序“Hello World!”

(1)Servlet就是Java类,编写好的Servlet也同Java类一样,放在src的package中。

TIPS:

自定义Servlet继承自HttpServlet,并通过Override父类方法实现相应Browser请求,Eclipse提供了Override的快捷方式:right-click==>Source==>Override/Import Methods。

(2)用Servlet实现“Hello World”:

public class HelloWorldServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();// Servlet通过IOStream的方式写入响应数据
out.println("<html>");
out.println("<head><title>Hello World Page</title></head>");
out.println("<body><h1>Hello World!</h1></body>");
out.flush();
}
}

(3)仅编写完成Servlet类还不足以能在Browser中访问该页面,还需要在web.xml(depolyment descriptor)中配置访问映射:

<servlet>
<servlet-name>helloworld</servlet-name><!-- 用于关联servlet-mapping -->
<servlet-class>com.karlspace7.crm.test.HelloWorldServlet</servlet-class><!-- servlet所在package -->
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>

(4)每一个Servlet都必须经过以上两步,启动Tomcat后才能在Browser中被访问到。

Remark:

一次访问流程:Browser地址栏输入https://localhost:8080/projectname/helloworld==>Enter==>Browser发送一次Request==>Server接收到Request==>寻找web.xml中servlet-mapping对应的url-pattern==>根据url-pattern对应servlet-name在servlet中找到servlet-class==>更具servlet-class所写package找到对应类==>(仅当第一次访问Servlet类,该类才会被编译成.class文件==>)执行代码返回Response。

Servlet是一个Java类,因此允许在编写Servlet时插入各种Java代码,比如:

out.println("<body>Hello World:"+new Date().toLocaleString()+"</body>");//在一个response中插入系统时间

4)JSP与Servlet比较

编写JSP可以像编写Html一样在页面中进行,而Servlet则是Java类。

JSP编写完存放于WebContent无需配置映射,Servlet编写完存放于src/package需要在web.xml中配置映射。

更改后,JSP无需重启,Servlet需要重启。

Servlet可看作嵌套了Html代码的Java类,JSP可看作嵌套了Java代码的Html页。



3、Servlet

1)使用Servlet处理Html表单

<body>
<form action="/MyCRM/formservlet" method="GET">
<label>username:</label><input type="text" name="username" /><br />
<label>password:</label><input type="password" name="password" /><br />
<input type="submit" value="submit" /><input type="reset"
value="reset" />
</form>
</body

left-click submit后,表单中所有数据都会协同该次请求提交到Server,Tomcat会将表单中数据封装到Request对象中,因此,在Servlet中想取得表单数据,可以通过HttpServletRequest的getParameter方法得到。

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
String username = request.getParameter("username");
String password = request.getParameter("password");

response.setContentType("text/html");
PrintWriter out = response.getWriter();// Servlet通过IOStream的方式写入响应数据
out.println("<html>");
out.println("<head><title>Form Page</title></head>");
out.println("<body><h1>username: </h1>" + username
+ "<h1>password: </h1>" + password + "</body></html>");
out.print("</html>");
out.flush();
}
若尝试打印HttpServletRequest&HttpServletResponse两个对象,会得到诸如:org.apache.catalina.connector.RequestFacad@1493103这样的输出,这是因为Sun使用了Facad模式开发了Servlet,即Sun提供技术规范(限定类名、方法及类的通讯方式与组织结构),而类的具体实现则由不同Server组织完成,因此若更换了Server输出也会变化(不同的Server组织用不同的方式实现了Request&Response接口)。

2)GET&POST方法

HTTP两种常用的数据传输方式。

form标签中method元素用于指定数据传输方式,默认为GET,可显示指定为POST。

GET方式传输数据会显示跟在url后边:

localhost:8080/projectname/resourcename?key=value&key=value&key=value。

POST方式传输数据会被放在Request正文内:

POST /resourcename HTTP/1.1
Accept:image/gif
Host:localhost
...
Cache-Control:no=cache
key=value&key=value

Notice:GET方式对传输数据长度具有限制,POST则没有,若想上传文件等较大的内容,只能用POST(或者用js脚本分批用GET方式上传)。

3)Servlet就是一个Java类

伪双色球Servlet,为了使用同一个种逻辑处理GET&POST两种方式传来的数据,可以让doGET&doPOST方法调用一个共同的方法:

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
process(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
process(request, response);
}
private void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
Set<Integer> set = new HashSet<Integer>();
Random random = new Random();
while (set.size() != 6)
{
int redValue = random.nextInt(33) + 1;
set.add(redValue);
}
int blueValue = random.nextInt(16) + 1;
String result = "red ball:";
for (Integer i : set)
{
result += " " + i;
}
result += "<br/>blue ball: " + blueValue;
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>Double Color Ball</title></head>");
out.println("<body><h1>" + result + "</h1></body>");
out.println("</html>");
out.flush();
}



4、JSP

在传统Html页面中加入Scriptlet和JSP标签就构成了JSP页面。

对于Servlet而言,Request&Response已被封装成对象,通过Request可以获取Browser SIde发来的参数,又通过向Response写入参数可以将Server Side反馈数据回传给Browser Side。因此我们可以像编写普通Java类一样,编写Servlet,用String形式将HTML标签写入Response的回传流,使Browser Side呈现出我们想让他们看到的结果页。

同样的,JSP中也可以通过小脚本<% java code %>插入Java代码:

<body>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("uername: " + username);
out.println("password: " + password);
%>
</body>

Notice:JSP中任何Scriptlet或JSP标签都会在Server Side处理完,回传至Browser SIde的只有静态的HTML页面,例如在JSP中使用Scriptlet插入一个Swing界面,JSP被调用后,只会在Server Side跳出该界面,并非在Browser Side跳出。

JSP执行流程:

request   jsp parser ↓servlet↓ servlet分析器JSDK   response
========> *.jsp ========> *.java ========> *.class ========>

由流程可见,当JSP被第一次访问时,会被jsp parser编译成Servlet,因此JSP本质上仍是Servlet。在JSP被第二次访问时,会跳过编译步骤,直接调用上一次被编译好的Servlet。

JSP原是代码包含JSP元素和Template data两类:Template data指JSP引擎不处理的部分,即标记<% %>以外的部分,例如HTML代码,这些数据会直接回传到Browser Side。JSP元素则是指由JSP引擎直接处理的部分,这一部分必须符合JAVA语法,否则导致编译错误。

JSP语法分为三种:Directive(<%@page import="java.io.*"%>)、Scriptlet、Action(<jsp:forward>、<jsp:getProperty>)。

JSP注释:〈%-- comments--%〉。JSP表达式:<%= new java.util.Date() %>。JSP声明:<%! int i = 3; %>。

Notice:JSP声明定义的变量是类变量,Scriptlet定义的变量是方法变量。方法变量位于_jspService方法内,每次Request都会被执行一次。

14