`
zjc85878482
  • 浏览: 40021 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jsp应用

阅读更多

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显示的是页面看到的内容

-->

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics