jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理,
也就是通过服务器将jsp页面转化成servlet,然后执行这个servlet来完成的。
服务器需要一个jsp容器来处理jsp页面,jsp容器通常以servlet的形式来实现,
这个servlet经过配置,可以处理对jsp页面的所有请求,
jsp容器负责将jsp页面转化成servlet,并编译这个servlet,这两步就构成了翻译阶段。
<%@ include file="test.jsp" %>
指令元素:翻译时将test.jsp全部代码包含在调用它的界面中(注意:test.jsp的有些代码不要同调用它的界面代码相同)
<jsp:include page="test.jsp" flush="true" />
行为元素:运行时(请求处理阶段)将test.jsp这个文件转化并被编译后产生的servlet类文件包含在其中
<%@ include指令元素是将其所指定页面(test.jsp)的实际内容(也就是代码段)加入到引入它的jsp页面中,
合成一个文件后被jsp容器将它转化成servlet,也即jsp页面被转化成servlet之前和它融和到一起
<jsp:include行为元素是指一个单独的文件(test.jsp)在执行后才被运行时调用,
也即jsp页面被转化成servlet之后被调用
HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什么?
request.getRequestURI() 返回值类似:/xuejava/requestdemo.jsp
request.getRequestURL() 返回值类似:http://localhost:8080/xuejava/requestdemo.jsp
HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什么?为什么要有两个不同的方法呢?
当用URL-rewriting方式来管理Session的时候,需要用到以上的两个方法。
两个方法的不同点是:两个方法确定是否需要包含session ID的逻辑不同。
在调用HttpServletResponse.sendRedirect前,应该先调用encodeRedirectURL()方法,否则可能会丢失Sesssion信息。
<!--
提交表单的方法:GET和POST两种
GET方法:URL包含了检索请求信息所需的所有信息,可将其加入书签以便将来重新调用。
传送的数据会在地址栏中显示,是字符流传输,且传送数据量有限制,有中文乱码问题。
POST方法:将数据打包发送,可加密数据,安全性高,传输数据量没有限制,不能被加入书签。
-->
<form method="POST" action="/getpost/get">
用户名:<input type="TEXT" name="user" />
<br><br>
密 码 :<input type="TEXT" name="pass" />
<br><br><br>
<input type="SUBMIT" style="width:80px;height:30px" value="提 交" />
</form>
//当客户端发出请求的时候,调用service方法并传递一个请求和响应对象。
//Servlet首先判断该请求是GET操作还是POST操作。然后它调用其中一个方法:doGet或doPost
//这里将doGet和doPost都写出来是为通用性(每次响应时只调用其中一个):让Servlet可以处理GET操作和POST操作
//doGet方法用来处理GET请求,如客户端是:<form method="GET" action="/getpost/get">
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletExceccption, IOException
{
request.setCharacterEncoding("gb2312"); //处理请求中的汉字问题
response.setContentType("text/html;charset=gb2312");//响应请求后返回页面(输出文档)的类型、编码
//当一个Servlet响应时将响应信息通过PrintWriter的对象out输出到网页(客户端)
PrintWriter out = response.getWriter();
/**
* getParameter()和getAttribute()的区别:
* 1、getParameter()得到的都是String类型,getParameter()方法用来获得请求参数(一般是通过GET或POST传来的值)
* getAttribute()取得用setAttribute设定的attribute(属性),获取对象容器中的对象(是对象类型)
* setAttribute(String name,Object object)在ServletContext中设置一个属性,名为name,值为object
* 2、getParameter():用于客户端重定向时,即点击了链接或提交按扭时传值用,在用表单或url重定向传值时接收数据用。
* getAttribute():用于服务器端重定向时,即在sevlet中使用了forward函数,或struts中使用了mapping.findForward。
* getAttribute只能收到程序用setAttribute传过来的值
* 此外:getInitParameter()用来取得WEB容器配置servlet时的信息,以及一些在.xml文件初始化的值
*/
//getParameter()方法是获取http提交的数据(即获取POST/GET传递的参数值):这里获取名为"user"的值
String user = request.getParameter("user");
String pass = request.getParameter("pass");
//请求是GET操作时,处理请求中的汉字问题
//user=new String(user.getBytes("8859_1"),"gb2312");
//pass=new String(pass.getBytes("8859_1"),"gb2312");
String msg1="用户名:" + user;
String msg2=" 密码:"+pass;
out.println(msg1);
out.println("<br><br>"); //换行
out.println(msg2);
out.close();
}
//doPost方法用来处理POST请求,如客户端是:<form method="POST" action="/getpost/get">
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
this.doGet(request, response); //调用doGet()方法,亦可将doGet()中的代码放这里
}
jsp页面两种跳转方式的异同
跳转方式一:
response.sendRedirect("test.jsp");
方式一是跳转到 test.jsp 页面。可以传递session范围内的参数,但是不能传递request中添加的参数。
HttpServletResponse接口定义了可用于转向的sendRedirect()方法。代码如下:
public void sendRedirect(java.lang.String location)throws java.io.IOException
这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如 response.sendRedirect("http: //java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根目录,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置 HTTP响应头信息的实现。
跳转方式二:
RequestDispatcher rd=request.getRequestDispatcher("test.jsp").forward(request, response);
方式二是既可传递session的参数,又可以传递request的参数。
如下:在request中添加参数: request.setAttribute("Parameter", "aValue");
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法,参见如下代码:
public interface RequestDispatcher {
void forward(ServletRequest request, ServletResponse response);
void include(ServletRequest request, ServletResponse response);
}
forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在 Servlet中处理,处理的结果转向到一个 JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。
1: request.getRequestDispatcher("url").forward(request,response)
不返回客户端,即客户端URL显示不变,request等将可用
2: response.sendRedirect("url")
要返回客户端一次,再自动请求URL,request等将不可用
<!--
jsp:useBean id="BG" scope="page|request|session|application"
其中id是一个大小写相关的名字,用来表示这个实例;scope表示此对象可以使用的范围
下面用id="BG",则"BG"就是Bean(即Back.java)
jsp:setProperty name="BG" property="textColor"可作如下理解:将当前页面的textColor值传给Back.java中的变量textColor
jsp:getProperty 则相反,用来提取Back.java中的变量textColor的值
property="textColor"表明:用户输入的textColor值来匹配Bean(Back.java中的变量textColor)的值,
property="*" 表示用户输入的所有值来匹配Bean中的属性,Bean中的属性的名字必须和request对象中的参数名一致
property个人理解是用来在当前页面和Bean对应变量之间进行传值的
-->
<jsp:useBean id="BG" class="com.Back" scope="request" >
<jsp:setProperty name="BG" property="textColor" />
<jsp:setProperty name="BG" property="backgroundColor" />
<jsp:setProperty name="BG" property="size" />
</jsp:useBean>
Class.forName("com.mysql.jdbc.Driver").newInstance(); //加载mysql jdbc驱动程序
String url="jdbc:mysql://127.0.0.1:3306/hyj"; //hyj为数据库名称
String user="root";
String password="admin";
String sql="select * from userinformation where username='hyj' "; //userinformation是数据库hyj中表名称
//DriverManager是驱动器管理器
conn=DriverManager.getConnection(url,user,password);//建立连接,Connection对象的实例conn代表驱动器与数据库的连接
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);//在连接conn中创建Statement对象
/**
* Statement对象是执行SQL语句的容器
* Statement提供对数据表的访问,ResultSet对象通常是通过执行“SQL语句”来生成的
* 例如:ResultSet rs=stmt.executeQuery(sql);
*/
/**
* Statement stmt=conn.createStatement(参数一,参数二)
第一个参数可以取值为
ResultSet.RTYPE_FORWORD_ONLY:这是缺省值,只可向前滚动; 注:第一个参数不能选默认值,否则,不能调用last,first等函数
ResultSet.TYPE_SCROLL_INSENSITIVE:双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
ResultSet.TYPE_SCROLL_SENSITIVE:双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。
第二个参数可以取值为
ResultSet.CONCUR_READ_ONLY:这是缺省值,指定不可以更新ResultSet
ResultSet.CONCUR_UPDATABLE:指定可以更新ResultSet
*/
/**
* PreparedStatement对象包含已编译的SQL语句,是Statement的子类
* 由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象
* 以下是用PreparedStatement对象添加数据库表添加信息的操作
* PreparedStatement pstmt = conn.prepareStatement("insert into student values(?,?,?,?)");
* pstmt.setString(1, st.getName());
* pstmt.setString(2, String.valueOf(st.getAge()));
* pstmt.setString(3, st.getNumID());
* pstmt.setString(4, st.getstudentClass());
* pstmt.execute();
* pstmt.close();
*/
// 根据参数sql语句进行查询,返回班级对象的数组
public ArrayList<SClass> getClassList (String sql) throws SQLException
{
ArrayList<SClass> classlist=new ArrayList<SClass>();
ResultSet rs;
PreparedStatement pstmt = conn.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next())
{
SClass sc=new SClass();
sc.setname(rs.getString("classname"));
sc.setnum(rs.getString("studentnum"));
sc.setsdept(rs.getString("sdept"));
classlist.add(sc);
}
rs.close();
pstmt.close();
return classlist;
}
Session是指一个客户端与服务器进行通信的时间间隔,
通常指从注册进入系统到注销退出系统之间所经过的时间。
具体到Web中的Session指的就是用户在浏览某个网站时,
从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
当我们在浏览器地址栏输入一个网址时,(如果能连上)该网站的服务器就会给这个浏览器页面(客户端)创建一个唯一的
session,JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session=request.getSession(true);来创建session
并通知客户端,然后客户端通过session就可以和服务器进行通信:客户端在每次访问的时候都会把这个 session信息放到http头中发送出去,在服务器端有个session列表,存了所有的session的相关信息,包括session的 sessionid、timeout等信息,
浏览器页面关闭(注意:不是本网站内页面跳转,除非跳转到别的网站)时,服务器端会自动将该session撤销(当超时时也会撤消)。
servlet容器在启动时会加载web应用,并为每个web应用创建唯一的ServletContext对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据,他提供了4个读取和设置共享数据的方法。具体见api帮助文档。
另外,ServletContext对象只在web应用被关闭的时候才被销毁,不同的web应用,ServletContext各自独立存在。
一个web应用由jsp,servlet,javabean等web组件的集合构成,每一个web应用,容器都会有一个背景对象,而javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。你可以通过一个servlet实例的 getServletContext()方法得到该servlet运行其中的这个背景对象,从这个背景对象中你可以访问如下信息资源:
1.初始化参数
2.存储在背景中的对象
3.与背景关联的资源
4.日志
最后针对ServletContext的总结是:
ServletContext即servlet容器,其内提供的方法可以在同一web应用下的所有servlet中被使用,getServletContext()方法返回ServletContext的对象。
对于ServletConfig对象来说,它与ServletContext相比,就有了很大的局限性。一个 ServletConfig对象是servlet container(WEB容器)在servlet initialization的时候传递给servlet的。当ServletConfig对象在servlet中被实例化后,对任何客户端在任何时候访问有效。但是一个servlet的ServletConfig对象不能被另一个servlet访问,也就是说,在本servlet声明后的 ServletConfig只能在本servlet内被访问,属于内部持久有效的变量。
1、jsp有哪些内置对象作用分别是什么
答:JSP共有以下9种基本内置组件:
request: 用户端请求,此请求会包含来自GET/POST请求的参数
response: 网页传回用户端的回应
pageContext: 网页的属性是在这里管理的
session: 与请求有关的会话期
application: servlet正在执行的内容,整个服务器的实例对象,存放容器的全局变量,
application和HttpServlet中的getServletContext()方法、ServletContext的对象可以认为一样(看它们的方法)
out: 用来传送回应的输出
config: servlet的构架部件,表示servlet配置(.xml),初始化时WEB容器通过config将某些信息传给servlet
page: JSP网页本身,该对象基本不用
exception: 针对错误网页,未捕捉的例外
2、jsp有哪些动作作用分别是什么
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
JSTL标签:
引入标签<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
标签中取值用${名},例如session.setAttribute("test","value");则可用${test}来获取value
web.xml配置
<!--所有的servlet写在这里-->
<servlet>
<!--依次写下每个servlet和类的对应关系-->
<servlet-name>action</servlet-name> // 这里指定servlet的名称,这个名称随你喜欢,只要不重复就行
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class> //这里指定servlet类的包路径注意大小写
<!--这里是servlet的初始化参数,共有两个-->
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup> //标记web容器启动的时候加载servlet的优先级,当值为0或者大于0时,容器在应用启动时就加载,值小的先装载,当是一个负数时或者没有指定时,容器在该servlet被调用时才加载
</servlet>
<!--写路径对应关系,下面配置的作用就是告诉web容器,在遇到<url-pattern>中的路径请求时就交给名为<servlet-name>的servlet来处理。-->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/hellow</url-pattern> //和url对应,比如输入http://localhost:8080/工程名/hellow,它会交给名字叫action的servlet来执行
</servlet-mapping>
<!-- 所有的监听listener写在这里 -->
<listener>
<listener-class>com.MyServletContextListener</listener-class>
</listener>
<!-- 所有的过滤filter写在这里 -->
<filter>
<filter-name>auth</filter-name>
<filter-class>com.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>auth</filter-name>
<url-pattern>/admin.jsp</url-pattern>
</filter-mapping>
<!-- 导入标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<!-- struts中配置struts-config.xml -->
<form-beans >
<form-bean name="deptForm" type="manager.form.DeptForm" />
<form-bean name="userForm" type="manager.form.UserForm" />
</form-beans>
<action
attribute="deptForm"
input="/dept/dept.jsp"
name="deptForm"
path="/dept"
scope="request"
type="manager.action.DeptAction"
parameter="method">
<forward name="deptPost" path="/dept/list.jsp" />
<forward name="modifyOradd" path="/dept/dept.jsp" />
</action>
<!-- struts中循环实现logic标签,userList是通过request返回页面的 -->
<logic:iterate id="user" name="userList">
<tr>
<td><CENTER><bean:write name="user" property="userName" /></CENTER></td>
<td><CENTER><bean:write name="user" property="position" /></CENTER></td>
<td><CENTER><bean:write name="user" property="officeTel" /></CENTER></td>
<td><CENTER>
<html:linkpage="/user.do?method=modifyOradd& userId=${user.userId}&deptId=${user.deptId}& roleId=${user.roleId}">修改</html:link>
<html:linkpage="/user.do?method=delete&userId=${user.userId}">删除</html:link>
</CENTER></td>
</tr>
</logic:iterate>
<select name="sex">
<c:choose>
<c:when test="${user.sex=='female'}"> <!-- 千万注意== -->
<option value="male" > 男 </option>
<option value="female" selected> 女 </option>
</c:when>
<c:otherwise>
<option value="male" selected> 男 </option>
<option value="female" > 女 </option>
</c:otherwise>
</c:choose>
</select>
<!-- deptList是通过request返回页面的 -->
<html:select property="deptId" name="userForm">
<html:options collection="deptList" property="deptId" labelProperty="deptName" />
</html:select>
<!--
html:options自动帮你迭代deptList中的内容,相当于一个for循环,前提是deptList是 Collection类型的,而且封装的是一个包含deptId, deptName属性的对象, property表示value, labelProperty显示的是页面看到的内容
-->
相关推荐
jsp应用开发详解.part1 因为上传文件大小受限part2请到我的资源下载 作者:作者:刘晓华//张健//周慧贞 译者:作者:刘晓华//张健//周慧贞 出版社:电子工业出版社 本书结合JSP和Servlet的最新规范,从基本的...
JSP编程 JSP应用教程 课后习题答案
可做毕业设计外文翻译,介绍JSP应用框架,中英文都有。
JSP应用开发与实践 (第三版)刘乃琦 第三章到第9章例子源码
jsp应用开发详解.part2 因为上传文件大小受限part1请到我的资源下载 作者:作者:刘晓华//张健//周慧贞 译者:作者:刘晓华//张健//周慧贞 出版社:电子工业出版社 本书结合JSP和Servlet的最新规范,从基本的...
面向JSP实际应用开发,通过大量的实例,循序渐进地为读者介绍了有关JSP开发所涉及的各类知识,同时还包含JDK、Tomcat...本书适合JSP初学者和JSP应用开发人员进行阅读和学习,同时也可作为计算机及相关专业的教材使用。
书 名 JSP应用开发与实践(1DVD) 丛 书 名 普通高等学校计算机教育“十二五”规划教材 标准书号 ISBN 978-7-115-29810-2[1] 作 者 刘乃琦 王冲 主编 本书作为JSP技术课程的教材,系统全面地介绍了有关...
资源名称:JSP应用开发详解(第三版)内容简介:本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JSP开发中的种种问题。...
JSP应用开发详解下载 JSP应用开发详解下载
jsp应用开发详解(第二版)全部源代码,一共40M,分三卷压缩,这是part2
JSP应用开发详解(第三版).刘晓华等.扫描版.pdf
jsp应用开发详解
JSP应用开发详解(JSP应用开发详解) JSP应用开发详解
jsp应用开发详解jsp应用开发详解jsp应用开发详解
JSP应用开发详解第三版 源代码 ch12
JSP应用开发与实践
jsp应用开发详解,jsp电子书pdf格式,经典教程,是jsp学习,开发不可多得的教程。
jsp应用开发详解(中文高清pdf版),学习jsp开发必不可少的好资料
一个简单JSP应用程序 在Netbeans中新建一个Web应用程序,同时在该程序内新建一个JSP网页,并命名为test.jsp。