JSP程序运行原理、文档结构及简单输入输出实例分析
本文实例讲述了JSP程序运行原理、文档结构及简单输入输出。分享给大家供大家参考。具体如下:
目标:
掌握Web应用的文档结构;
掌握JSP的运行原理;
掌握JSP的简单输入和输出。
主要内容:
通过一个简单实例介绍Web应用的文档结构和运行原理;
通过一个简单的注册功能介绍基本的输入输出。
实现内容:客户端验证。
1、文档结构
每个应用都有一个根目录,例如ch2;理论上可以放在任何地方,但是需要配置,简单的做法,直接放在了webapps这个目录下,在这个目录的应用会被自动加载。
在根目录下会有一个WEB-INF目录,这个目录中的文件不能被远程访问,主要存放配置文件和类文件、资源文件。
在WEB-INF中的配置文件是web.xml,每个web应用都会有这样一个配置文件。
在WEB-INF有两个文件用于存放类文件和资源文件,lib和classes,lib下面存放以压缩包jar形式存在的类库,classes直接存放类文件(包含包的信息)。
页面文件(包括jsp文件、html文件、图片文件)可以放在根目录(ch2)下面,或者下面的子文件夹(不能放在WEB-INF)中。
2、运行方式
访问方式:http://192.168.0.222:8080/ch2/ch2.jsp
前提:把Web应用部署到服务器上,启动服务器。
下面以ch2.jsp为例介绍访问过程:
1)客户端通过浏览器发送请求;
2)Web服务器接收这个请求,然后转给应用服务器;
3)应用服务器会查找客户要访问的文件,假设访问的文件为ch2.jsp;分两种情况:
第一次访问:应用服务器把JSP文件转换成Java文件;然后编译成class文件;然后加载类;实例化对象并初始化;
后续访问:JSP文件对应的页面对象已经存在,直接查找到这个对象;
4)应用服务器封装请求信息,然后调用相应的方法;
5)应用服务器把方法执行结果(响应客户的内容)传递给Web服务器;
6)Web服务器把这个结果发给客户端;
7)客户端浏览器把接收到的html代码解析成网页。这个就是我们看到的结果。
下面是运行过程中的几个文件内容。
源文件Ch2.jsp的内容:
DDDDDDDDDDDDDDDDDDDDDDDD
<%="FFFFFFFFFFFFFFFF"%>
转换后的文件ch2_jsp.java:
packageorg.apache.jsp; importjavax.servlet.*; importjavax.servlet.http.*; importjavax.servlet.jsp.*; publicfinalclassch2_jspextendsorg.apache.jasper.runtime.HttpJspBase implementsorg.apache.jasper.runtime.JspSourceDependent{ privatestaticjava.util.List_jspx_dependants; privatejavax.el.ExpressionFactory_el_expressionfactory; privateorg.apache.AnnotationProcessor_jsp_annotationprocessor; publicObjectgetDependants(){ return_jspx_dependants; } publicvoid_jspInit(){ _el_expressionfactory=JspFactory.getDefaultFactory().getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_annotationprocessor=(org.apache.AnnotationProcessor)getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); } publicvoid_jspDestroy(){ } publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse) throwsjava.io.IOException,ServletException{ JspFactory_jspxFactory=null; PageContextpageContext=null; HttpSessionsession=null; ServletContextapplication=null; ServletConfigconfig=null; JspWriterout=null; Objectpage=this; JspWriter_jspx_out=null; PageContext_jspx_page_context=null; try{ _jspxFactory=JspFactory.getDefaultFactory(); response.setContentType("text/html"); pageContext=_jspxFactory.getPageContext(this,request,response, null,true,8192,true); _jspx_page_context=pageContext; application=pageContext.getServletContext(); config=pageContext.getServletConfig(); session=pageContext.getSession(); out=pageContext.getOut(); _jspx_out=out; out.write("DDDDDDDDDDDDDDDDDDDDDDDD/r/n"); out.print("FFFFFFFFFFFFFFFF"); }catch(Throwablet){ if(!(tinstanceofSkipPageException)){ out=_jspx_out; if(out!=null&&out.getBufferSize()!=0) try{out.clearBuffer();}catch(java.io.IOExceptione){} if(_jspx_page_context!=null)_jspx_page_context.handlePageException(t); } }finally{ if(_jspxFactory!=null)_jspxFactory.releasePageContext(_jspx_page_context); } } }
返回给客户端的信息(通过浏览器的查看源文件功能可以看到):
DDDDDDDDDDDDDDDDDDDDDDDD
FFFFFFFFFFFFFFFF
3、无状态的请求应答模式
用户通过客户端发送请求,可以通过地址栏、超链接、按钮或者表单元素的事件请求。不管采用什么方式发送请求,这些请求信息都会被封装成HttpServletRequest对象,服务器会把这个对象作为参数去调用页面对象,这个方法执行完会对客户端响应,之后这个HttpServletRequest对象就被删除了。如果再次发送请求,会创建新的HttpServletRequest对象,上一次访问时候的信息都不存在了。
所以服务器不会保存客户端以前访问的信息,称为无状态的请求应答模式。
接下来介绍JSP技术的基本问题:输入输出。首先看如何完成输入。
4、输入元素
输入通过表单元素完成。常用的表单元素如下:
1)form
要提交信息,首先需要一个表单form,只有在form内的信息才可以提交。
开始标识<form>
结束标识</form>
主要的属性:
action属性:是目标文件的位置,要提交给谁处理;
method属性:请求方式,有get和post
注意:form不能嵌套。
2)单行文本框
基本语法格式:
<inputtype="text"name="username"value="请输入用户名">
type="text"就说明这是单行文本框;
name表示文本框的名字,非常重要,在服务器需要根据名字取值;
value给出初始值。
3)密码框
基本语法格式:
<inputtype="password"name="userpass">
用法与单行文本框基本相同。
4)隐藏域
基本语法格式:
<inputtype="hidden"name="userpass">
用于在多个页面之间传值,与当行文本框的用法也基本相同。
5)单选按钮
语法格式:
<inputtype="radio"name="sex"value="男">男
<inputtype="radio"name="sex"value="女">女
一组单选按钮的名字应该保持一致,这样能够保证多个选项只选择一个。
注意:单选按纽之后显示的内容与单选按纽没有关系,只是告诉用户这个单选按纽表示什么。
6)复选框
语法格式:
<inputtype="checkbox"name="fav"value="音乐">
<inputtype="checkbox"name="fav"value="体育">
同一组复选框的值也应该保持一致,可以采用统一的方式取值。
7)下拉列表
语法格式:
开始标识:<selectname="select">
结束标识:</select>
下拉框中的每个选项:<optionvalue="1">显示的信息</option>
性别下拉框:
<selectname="sex">
<optionvalue="男">男</option>
<optionvalue="女">女</option>
</select>
8)多行文本域
语法格式:
<textareaname="">sdsfsddddddddd</textarea>
要对文本域初始化,需要把初始值放在标签的开始和结束标识之间。
注意:这一点与其它元素通过value属性赋值是不一样的。
9)提交按钮
<inputtype="submit"value="提交">
通常不需要名字。
10)重置按钮
<inputtype="reset"value="重置">
通常不需要名字。
11)普通按钮
也可以通过普通按钮完成表单提交,需要编写JavaScript代码。
语法格式:
<inputtype="button"value="提交"onClick="…">
5、输入实例:注册页面
参考代码register.jsp:
<%@pagecontentType="text/html;charset=gb2312"%> 请注册<br> <formmethod="post"name="fi1"action="process.jsp"> 用户ID:<inputtype="text"name="userid"><br> 口令:<inputtype="password"name="userpass"><br> 确认口令:<inputtype="password"name="userpass1"><br> 性别:<inputtype="radio"name="sex"value="男"checked>男 <inputtype="radio"name="sex"value="女">女<br> 爱好:<inputtype="checkbox"name="fav"value="运动">运动 <inputtype="checkbox"name="fav"value="音乐">音乐 <inputtype="checkbox"name="fav"value="编程">编程<br> 学历: <selectname="degree"> <optionvalue="本科">本科</option> <optionvalue="硕士">硕士</option> <optionvalue="专科">专科</option> <optionvalue="博士">博士</option> </select><br> 备注: <textareaname="comment"></textarea><br> <inputtype="submit"value="提交"><inputtype="reset"value="重置"> </form>
该页面能够完成用户信息的提交,当用户输入和选择完之后点击提交按钮,浏览器会把这个请求发送到服务器,根据form中的action属性的值,我们知道服务器会调用process.jsp进行处理。下面介绍如何编写process.jsp来获取用户输入信息。
6、获取信息
前面介绍运行原理的时候说过,客户的请求信息,包括输入的和选择的信息,都会被封装在HttpServletRequest对象中,所以在process.jsp中只需要访问这个对象即可,如何得到这个对象呢?
在JSP中提供了若干内部对象,其中之一是request,直接使用这个对象即可。对于内部对象,我们可以直接使用,不需要声明和实例化。
获取请求信息可以通过下面的两个方法:
getParameter(元素名字)
getParameterValues(元素名字)
前者用于获取单值元素的值,例如文本框、单选按钮、密码框等。后者用于获取多值元素的值,例如复选框、允许多选的列表框。
7、实例:注册信息显示
process.jsp的源文件:
<%@pagecontentType="text/html;charset=gb2312"%> 注册信息如下: <% Stringuserid=request.getParameter("userid"); Stringuserpass=request.getParameter("userpass"); Stringuserpass1=request.getParameter("userpass1"); Stringsex=request.getParameter("sex"); //对性别进行编码转换 sex=newString(sex.getBytes("8859_1")); String[]fav=request.getParameterValues("fav"); //该方法用于获取多值元素的值 Stringdegree=request.getParameter("degree"); Stringcomment=request.getParameter("comment"); out.println("用户ID:"+userid); %> <br>口令:<%=userpass%> <br>确认口令:<%=userpass1%> <br>性别:<%=sex%> <br>爱好: <% if(fav!=null) for(Strings:fav) { s=newString(s.getBytes("8859_1")); out.print(s); } %> <br>学历:<%=degree%> <br>备注:<%=comment%>
注:此种方式的代码(Java代码与HTML代码嵌套)不提倡,这里仅仅是为了让这个程序比较完整。但是获取值和编码转换的代码需要掌握,以后在Servlet中会用,没有什么变化。
8、实训:完成图书添加界面,并把用户添加的信息重新显示出来。
希望本文所述对大家的JSP程序设计有所帮助。