Servlet和JSP 起初,Web服务非常简单,网页就是单纯的网页,没有很多复杂的功能。那时候的web服务其实就是单纯的传递客户端与HTML文件之间的数据,随着不断地开发,计算机网页已经不仅仅局限于浏览,而是功能越来越全面强大的应用。从而web服务将数据进行一定程度的运算,然后再返回给客户端。
这个过程的雏形就是Servlet的。Servlet(小型应用程序,小服务程序)最早是由Java编写的。为了替代CGI(公共网关接口),速度慢且内存要求高的PHP/ASP等语言开始出现。而JSP是使用PHP相似的形态,与HTML位为中心的java程序连接。
如图所示,JSP与Servlet比较而言,一个是要求Java与HTML都要会,一个只需要HTML,以及极少部分的Java格式就能够编写,上手简单,且JSP可以在HTML格式里调用Java方法,从而使HTML的功能得到扩展。
JSP的特点:
- 可是使用所有Java 的功能,因此Java 的更新意味着JSP的更新,发展空间非常大
- 用Servlet处理的程序可以用记事本打开,对于用户而言也能够根据需求圆滑处理一些事务。
- JSP和一些Servlet之间的数据可以很简单的共享
- 可使用Beans。(Java组件)
- 可以使用类似JSTL(JSP Standard Tag Library)的tag数据库,即便不使用Java代码,也有很多标签可以实现功能
- 可以结合多种框架(Spring,MVC .etc)来处理事务
基础要求:要求对HTML5,CSS,JS有基础知识储备
进阶要求:对Java,Servlet,JDBC有知识储备
高级要求:DB,XML,Mobile Programming,Framework
JSP处理过程
- 客户端输入URL
- DNS解析
- 返回IP地址
- 使用IP地址访问JSP(web服务器在JSP内部)
- 返回HTML网页
Servlet内部处理过程
JSP和Servlet有差别。JSP是像HTML一样的简单的文本文件结构,而Servlet是由JAVA代码编写的,JSP通过Servlet容器的代码编写成类文件(Java文件)来处理事务
- JSP接收来自客户端的请求
- 确认是否有对应请求的Servlet文件,如果有则执行该文件;如果没有则将该JSP编码成Servlet文件并装到Servlet容器中,然后执行该文件
- 如果有需要传输给数据库进行操作的要求,则传输给数据库,否则直接返回
JSP文件比起一般文档文件,是 由HTML的标签代码和Java代码的混合版。举个例子,当有一个jsp文件第一次被执行,由于不存在对应的类,所以会创建一个同名类。然后到内存中运行,然后生成对应的实例( instance/实体变量)。然后开始处理用户的请求,使用的_jspServer()方法。执行完毕或出现异常中断时,容器会结束并执行jspDestory()方法销毁内存的jsp文件。
JSP凭借容器将本身的混合代码转化到java代码,以Servlet的形态运行。在JSP生命周期结束后被销毁,但是其转换的java代码常驻于容器,当再次调用未改动的JSP文件时,不需要重新编码,直接进入内存执行。
基于Bean的JSP处理过程
- 根据浏览器传来的请求处理,如果是HTML则直接返回HTML网页。如果是JSP则进入下一步
- JSP进入容器,然后利用useBean方法访问Bean类
- 如果需要的话,访问数据库并进行相关数据库的操作
- 否则调用对应的JSP,处理完请求后,返回客户端
- JSP进入容器后,可能有其他JSP正在使用beans,需要等待
HelloWorld.jsp 1.在该路径下创建一个新的文件夹,文件夹名就是对应的web服务名。这里更应该说是实验,毕竟Helloworld是每个程序的基础
2.编写代码,如图
3.startup Tomcat的批处理文件,然后登陆本地8080端口
4.登录后按照创建的目录文件夹输入地址打开对应jsp文件
就可以看到我们的结果图。
5.找到生成的Java文件
运行成功后,我们可以在work文件夹下,如图所示的级联里找到对应的java文件。
可以找到被编译成Java语言的JSP内容。
计算器(Bean&Code) cala1:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
// 변수설정
int result = 0;
// 웹페이지 요청이 post 인 경우에만 수행 즉 form 을 통해 전달된것만 수행
// 초기 로딩시 오류방지
if(request.getMethod().equals("POST")) {
// 연산자를 가지고 옴.
String op = request.getParameter("operator");
// 문자열 형태로 전달된 인자들을 int 로 변환함.
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
// 각 연산자별 처리
if(op.equals("+")) {
result = num1+num2;
}
else if(op.equals("-")) {
result = num1-num2;
}
else if(op.equals("*")) {
result = num1 * num2;
}
else if(op.equals("/")) {
result = num1 / num2;
}
}
%>
<HTML>
<HEAD>
<TITLE>ch03 : 计算器 </TITLE>
</HEAD>
<BODY>
<div align="center">
<H3>计算器</H3>
<HR>
<form name=form1 method=post>
<INPUT TYPE="text" NAME="num1" width=200 size="5">
<SELECT NAME="operator">
<option selected>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</SELECT>
<INPUT TYPE="text" NAME="num2" width=200 size="5">
<input type="submit" value="运算" name="B1"> <input type="reset" value="重新输入" name="B2">
</form>
<HR>
计算结果: <%=result %>
</div>
</BODY>
</HTML>
界面如上(中文部分换成了韩语)。这是一个很简单的运算符重载的Java代码。且可以直接通过浏览器地址来访问。
cala2:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%-- CalcBean 生成一个calc类接口 --%>
<jsp:useBean id="calc" class="jspbook.ch03.CalcBean"/>
<%-- 通过调用calc 对象的setter方法来传递数据 --%>
<jsp:setProperty name="calc" property="*" />
<%-- 调用计算机方法 --%>
<% calc.calculate(); %>
<HTML>
<HEAD>
<TITLE> 计算机 </TITLE>
</HEAD>
<BODY>
<div align=center>
<H3>ch03 :计算机</H3>
<HR>
<form name=form1 method=post>
<INPUT TYPE="text" NAME="num1" width=200 size="5">
<SELECT NAME="operator">
<option selected>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</SELECT>
<INPUT TYPE="text" NAME="num2" width=200 size="5">
<input type="submit" value="计算" name="B1"> <input type="reset" value="重新输入" name="B2">
</form>
<HR>
计算结果 : <jsp:getProperty name="calc" property="result" />
</div>
</BODY>
</HTML> 但是,这个代码制成的jsp网页却无法直接访问。原因是没有Bean的存在。
比较二者的区别:
对于Calc1,功能由本身的代码实现,而Calc2只是提供了接口,具体的事务处理功能在Bean中进行。他们的区别是后者,可以实现对其他JSP项目的请求,当有需要时,其他JSP项目也能够通过该Bean内的类接口来实现对应的功能。
下一步来配置这个Bean的环境。首先是Bean的代码:public class CalcBean{
private int num1,num2;
private String operator="";
private int result;
public void calculate() {
if(operator.equals("+")) {
result = num1 + num2;
}
else if(operator.equals("-")) {
result = num1 - num2;
}
else if(operator.equals("*")) {
result = num1 * num2;
}
else if(operator.equals("/")) {
result = num1 / num2;
}
}
public void setNum1(String num1) {
this.num1 = Integer.parseInt(num1);
}
public void setNum2(String num2) {
this.num2 = Integer.parseInt(num2);
}
public void setOperator(String operator) {
System.err.println("## "+operator);
this.operator = operator;
}
public int getResult() {
return result;
}
} cd 目录
javac -d . -encoding UTF-8 CalcBean.java
编译这段的java类文件即可
就会在对应路径下生成类文件了
然后创建新文件夹在指定路径下,命名为WEB-INF。在该文件夹里新建classes文件夹。
将刚刚编译获得的文件夹(内含路径如下图所示)
放在指定目录下,然后就可以运行calc2.jsp了。
运行结果与calc1相同,只不过实现方式变了。
|