JSP/Servlet(一)

 

Web应用和web.xml文件:

一、构建Web应用:

1、在任意目录下创建一个文件夹。

2、在第1步所建的文件夹内建一个WEB-INF文件夹(注意大小写)。

3、进入Tomcat或任何其他web容器内,找到任何一个web应用,将Web应用的WEB-INF下的web.xml文件

复制到第2步所建的文件夹下。

4、修改复制后的web.xml文件,将该文件修改成只有一个跟元素的XML文件,如下。

<?xml version="1.0" encoding="GBK"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>

  在WEB-INF文件下新建两个文件夹:classes和lib。

    classes文件夹:保存单个*.class文件;lib文件夹:保存打包后的JAR文件。

5、把该web应用复制到Tomcat的webapps路径下。通常我们只要将jsp放在web应用的根目录下,就可以通过浏览器来访问这些页面了。

<webDemo>---------这是应用的名称,可以改变

|-WEB-INF

|  |-classes

|  |-lib

|  |-web.xml

|-<*.jsp>

 

JSP的基本原理:

  jsp的本质是servlet。jsp通过在标准的HTML页面中嵌入java代码,其静态的部分无需Java程序控制,只有那些需要从数据库读取或需要

动态生成的的页面内容,才使用Java脚本控制。

  jsp页面内容:

  >静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同。

  >动态部分:受Java程序控制的内容,这些内容由Java程序来控制。

<%@ page language="java" contentType="text/html; charset=UTF-8"  language = "java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>这是一个jsp页面代码</title>
</head>
<body>
欢迎进入<br>
现在是时间是:
<%out.println(new java.util.Date()); %>
</body>
</html>

注意:JSP的本质依然是servlet,每个JSP页面就是一个Servlet实例——JSP页面有系统编译成Servlet,Servlet再负责响应用户请求。

JSP的工作原理:

    Client            →发出请求→        JSP Server(如果该JSP页面第一次收到请求,先编译JSP文件,生成对应的Servlet,如果该JSP页面已有对应的

          ←返回标准的HTML页面←    的Servlet,这根据请求动态生成标准的HTML页面。注:每次都会根据请求动态生成HTML文档。)

1、JSP文件必须在JSP服务器内运行。

2、JSP文件必须生成servlet才能执行。

3、每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。

4、JSP页面的访问者无须安装任何客户端,甚至不需要可以运行的Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。

JSP注释:

  JSP注释格式: <%-- 注释内容 --%>

  而HTML注释格式:<!-- 注释内容 -->

  HTML的注释可以通过源代码查看到,但JSP的注释是无法通过源代码查看到的。这表名JSP注释不会被发送到客户端。

JSP声明:

  JSP声明用于声明变量和方法。JSP声明的语法格式如下:

  <%!  声明部分   %>

<%@ page language="java" contentType="text/html; charset=UTF-8"  language = "java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>这是一个jsp页面</title>
</head>
<!-- 下面是JSP声明部分 -->
<%!
// 声明一个变量
public int count = 0 ;
// 声明一个方法
public String info()
{
return "hello : " + count ;
}
%>
<body>
<!-- 每次刷新count的值都会加1 -->
<%
out.println(++ count) ;
%><br/>
<%
out.println(info()) ;
%>
</body>
</html>

输出JSP表达式:

  输出表达式值的语法格式: <%=表达式>

  输出表达式将转换成Servlet里面的输出语言。

JSP脚本:

  JSP脚本中可以放置任何可执行性语句,所以可以充分利用Java语言的功能,例如连接数据库和执行数据库。

  例子:

<%@page import="java.sql.*"%>
<%@page language="java" contentType="text/html; charset=UTF-8" errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>连接数据库脚本测试</title>
</head>
<body>
<table bgcolor = "yellow" border = "1" width = "300px">
<%
// 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver") ;
// 获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/select_test","root","hezuoan") ;
// 创建Statement
Statement stmt = conn.createStatement() ;
// 查询
ResultSet rs = stmt.executeQuery("select * from student_table") ;
while(rs.next())
{
%>
<tr>
<td><%=rs.getString(1)%> </td>
<td><%=rs.getString(2)%> </td>
<td><%=rs.getString(3)%> </td>
</tr>
<%
}
%>
</table>
</body>

  (执行SQL查询需要使用MySQL驱动程序,将驱动的JAR文件放在Tomcat的lib路径下。)

JSP的三个编译指令:

> page :该指令是针对当前页面的指令。

> include :用于指定包含另一个页面。

> taglib :用于定义和访问自定义标签。

格式如下:<%@ 编译指令名 属性名="属性值"... %>

一、page 指令:

  page指令通常位于JSP页面的顶端,一个JSP页面可以使用多个page指令。语法格式如下:

  <%@page

  [language="Java"]

  [extends= "package.class"]

  [import = "package.class|package.*..."]

  [session= "true|false"]

  [buffer = "none|8KB|size Kb"]

  [autoFlush = "true|false"]

  [isThreadSafe = "true|false"]

  [info = "text"]

  [errorPage = "relativeURL"]

  [contentType = "mimeType[; charset = characterSet]"|"text/html ; charset = ISO-8859-1"]

  [pageEncoding = "ISO-8859-1"]

  [isErrorPage = "true|false"]

  %>

  各指令的属性定义:

  language : 声明当前JSP页面使用的脚本语言的种类,通常默认是Java 。

  extends  : 指定JSP页面编译所产生的Java类所继承的父类,或所实现的接口。

  import : 导入包。 (下面几个包是系统默认导入的:java.lang.* ; javax.servlet.*; javax.servlet.jsp.*;javax.servlet.http.* ;)

  session : 设定这个JSP页面是否需要HTTP Session。

   buffer : 指定输出缓冲区的大小。

  autoFlush : 当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。

  info : 设置该JSP程序的信息,也可以看做其说明,可以通过Servlet.getServletInfo()方法获取。

  errorPage : 指定错误处理页。

  isErrorPage : 设置本JSP页面是否为错误处理程序。

  contentType : 用于设定生成网页的文件格式和编码字符集,即MIME类型和页面字符集类型。  

          默认的MIME类型是 text/html ;默认的字符集类型为ISO-8859-1.

  PageEncoding :是定生成网页的编码字符集。

二、include指令

  使用include指令,可以将一个外部文件嵌入到当前JSP文件中。语法格式:

  <%@include file = "relativeURLSpec"%>

JSP/Servlet(二)

 

JSP的7个动作指令:

  编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的动作。

  jsp:forward : 执行页面转向,将请求的处理转发到下一个页面。

  jsp:param : 用于传递参数,必须与其他支持参数的标签一起使用。

  jsp:include : 用于动态引入一个JSP页面。

  jsp:plugin : 用于下载JavaBean或Applet到客户端。

  jsp:useBeam : 创建一个JavaBean的实例(初始化)。

  jsp:setProperty : 设置JavaBean实例的属性值。

  jsp:getProperty : 输出JavaBean实例的属性值。

  

一、forward 指令

  forward指令用于将页面响应转发到另外的页面。

  JSP使用语法:

对于JSP1.1

    <jsp:forward page = "{relativeURL|<%=expression%>}"/>

      {<jsp:param .../>}

    </jsp:forward>

  在转发时增加额外的请求参数。增加的请求参数值可以通过HttpServletRequest类的getParameter()方法获取。

  在另一页面使用request内置对象(request内饰对象是HttpServletRequest的实例)来获取增加的请求参数值 。

  <%=request.getParameter("参数名字")%>

  

二、include指令

  下面是include动作指令的语法格式:

  <jsp:include page = "{relativeURL|<%=experssion%>}" flush = "true"/>

  或者

  <jsp:include page = "{relativeURL|<%=experssion%>}" flush = "true"/>  

        <jsp:param name = "parameterName" value= "parameterValue"/>

  </jsp:include>

  flush 属性用于指定输出缓存是否转移到被导入文件中。

  

三、useBean、setProperty、getProperty指令

  如果多个JSP页面需要重复使用某一段代码,我们可以把这段代码定义成Java类的方法,然后让多个JSP页面

调用该方法便可。

  useBean语法格式:

  <jsp:useBean id = "name" class = "classname" scope = "page|request|ssesion|application" />

  id属性是JavaBean的实例名。

  class属性确定JavaBean的实现类。

  scope属性用于指定JavaBean实例的作用范围该范围有4个值。

    1、page : 该JavaBean实例只在该页面有效。

    2、request : 该JavaBean实例只在本次请求有效。

    3、session : 该JavaBean实例只在本次Session有效。

    4、application  : 该JavaBean实例在本次应用内一直有效。

  setProperty的语法格式:

  <jsp:setProperty name = "BeanName" property = "propertyName" value = "value" />

    name 属性确定需要设定的JavaBean的实例名 ;

    prototype 属性确定需要设定的属性名 ;

    value 属性确定设定需要设置的属性值。

  getProperty 的语法格式:

  <jsp:getProperty name = "BeanName" property = "propertyName" />

   例子如下:

<%@ 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">
<html>
<head>
<title>BeanTest</title>
</head>
<body>
<!-- 创建实例 -->
<jsp:useBean id="BeanTest_1" class = "com.cnblogs.jbelial.Person" scope = "page" ></jsp:useBean>
<!-- 设置属性值 -->
<jsp:setProperty property="name" name="BeanTest_1" value = "hezuoan"/>
<jsp:setProperty property="age" name="BeanTest_1" value = "19"/>
<jsp:setProperty property="sex" name="BeanTest_1" value = "M"/>
<!-- 输出属性值 -->
<jsp:getProperty property="name" name="BeanTest_1"/>
<jsp:getProperty property="age" name="BeanTest_1"/>
<jsp:getProperty property="sex" name="BeanTest_1"/>
</body>
</html>

  

package com.cnblogs.jbelial;
public class Person {
String name ;
String sex ;
int age ;
public Person()
{
}
public Person(String name , int age , String sex)
{
this.name = name ;
this.sex = sex ;
this.age = age ;
}
public void setName (String name)
{
this.name = name ;
}
public void setSex (String sex)
{
this.sex = sex ;
}
public void setAge (int age)
{
this.age = age ;
}
public String getName()
{
return this.name ;
}
public String getSex()
{
return this.sex ;
}
public int getAge()
{
return this.age ;
}

四、param指令

  param指令用于设置参数。参考上面的代码。

  param指令不能单独使用。

JSP/Servlet(三)

 

JSP脚本中的9个内置对象:

  JSP脚本中包含了9个内置对象,这9个内置对象都是Servlet API接口的实例(可以直接使用)。

  JSP内置对象的实质:他们要么是_jspService()方法的形参,要么是_jspService()方法的局部变量,所以在

JSP脚本中调用这些对象,无须创建它们。

application 对象

  application是javax.servlet.ServletContext的实例。代表JSP所属的Web应用本身,可用于JSP页面,或者

在Servlet之间交换数据。

  对于application通常有如下两个作用:

  >在整个Web应用的多个JSP、Servlet之间共享数据。

  >访问Web应用的配置参数。

1、让多个JSP、Servlet共享数据

  application 通过 setAttribute(String attrName , Object value)方法将一个值设置成application的attrName属性

该属性的值对整个Web应用有效,该Web应用的每个JSP页面或Servlet都可以通过getAttribute(String attrName)来访问

该属性。

  实例:

<%@ 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">
<html>
<head>
<title>application_setAttribute test</title>
</head>
<body>
<%!
int i ;
%>
<%
application.setAttribute("count", String.valueOf(++i)) ;
%>
<%= i %>
</body>
</html>
<%@ 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">
<html>
<head>
<title>application_getAttribute test</title>
</head>
<body>
<%=application.getAttribute("count") %>
</body>
</html>

  application不仅可以用于两个JSP页面之间的共享数据,还可以用于JSP和Servlet之间共享数据。

  注意:不要仅为了JSP、Servlet共享数据就将数据库放入application中,通常只应该把Web应用的状态数据放入application里。

2、获得Web应用配置参数。

  application还可以获取Web应用的配置参数。如下代码:

  

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application test</title>
</head>
<body>
<%
// 从配置中获取参数
String driver = application.getInitParameter("driver") ;
String url = application.getInitParameter("url") ;
String user = application.getInitParameter("user") ;
String pass = application.getInitParameter("pass") ;
// 注册驱动
Class.forName(driver) ;
// 连接数据库
Connection conn = DriverManager.getConnection(url, user, pass) ;
Statement stmt = conn.createStatement() ;
ResultSet rs = stmt.executeQuery("select * from student_table ") ;
%>
<table bgcolor = "yellow" border = "1" width = "500">
<!-- 遍历结果 -->
<%
while(rs.next())
{
%>
<tr>
<td><%=rs.getString("student_id") %></td>
<td><%=rs.getString("student_name") %></td>
<td><%=rs.getString("java_teacher") %></td>
</tr>
<%
}
%>
</table>
</body>
</html>

  

  使用application的getInitParameter(String paramName) 来获取Web应用的配置参数,这些参数应该在web.xml文件中。

同时web.xml文件中使用context-param元素配置,每一个<context-param.../>元素配置一个参数。该元素有如下两个子元素。

  >param-name:配置Web参数名。

  >param-value:配置Web参数值。

  格式如下:

  <context-param>

    <param-name> driver </param-name>

    <param-value> com.mysql.jdbc.Driver </param-value>

  </context-param>

 

config 对象:

  config 是javax.servlet.ServletConfig的实例,该实例代表JSP的配置信息。常用的方法有:

  getInitParameter(String paramName)和getInitParameternames() 等。由于JSP页面通常无须配置,因此也就不存在配置信息。

  所以在JSP页面中较少使用,但在Servlet中则用处相对较大。

exception对象:

  exception是Throwable的实例,代表JSP脚本中产生的异常和错误,是JSP页面异常机制的一部分。

  exception对象仅在异常处理页面才有效,即isErrorPage为true时。

out对象:

  out对象代表一个页面的输出流,通常用于在页面上输出变量值及常量。

  

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application test</title>
</head>
<body>
<%
// 从配置中获取参数
String driver = application.getInitParameter("driver") ;
String url = application.getInitParameter("url") ;
String user = application.getInitParameter("user") ;
String pass = application.getInitParameter("pass") ;
// 注册驱动
Class.forName(driver) ;
// 连接数据库
Connection conn = DriverManager.getConnection(url, user, pass) ;
Statement stmt = conn.createStatement() ;
ResultSet rs = stmt.executeQuery("select * from student_table ") ;
%>
<table bgcolor = "yellow" border = "1" width = "500">
<!-- 遍历结果 -->
<%
while(rs.next())
{
//输出表格行
out.println("<tr>") ;
out.println("<td>") ;
out.println(rs.getString("student_id")) ;
out.println("</td>") ;
out.println("</tr>") ;
}
%>
</table>
</body>
</html>

  out负责输出页面表格及所有内容。

  注意:所有使用out的地方,都可使用输出表达式来代替。<%=...%>的本质就是out.write(...)。

pageContext对象:

  pageContext是javax.servlet.jsx.PageContext的实例,这个对象代表页面上的上下行,

  该对象主要用于访问JSP之间的共享数据。使用pageContext()可以访问page、request、session、application范围的变量。

它提供了如下两个方法来访问变量:

  >getAttribute(String name) :取得page范围内的name属性。

  >getAttribute(String name , int scope):取得指定范围内的name属性,

   其中scope可以是下面几个值。

      > PageContext.PAGE_SCOPE :对应与page范围。

      > PageContext.REQUEST_SCOPE :对应与request范围。

      > PageContext.SESSION_SCOPE :对应与session范围。

      > PageContext.APPLICATION_SCOPE :对应与application范围。

  与getAttribute()方法相对应,PageContext也提供了两个setAttribute()方法。用于将指定变量放入四个范围内。

  pageContext还可用于获取其他内置对象,pageContext对象包含如下方法

  > ServletRequest getRequest() :获取request对象。

  > ServletResponse getResponse() :获取response对象。

  > ServletConfig getServletConfig() :获取application对象。

  > ServletContext getServletContext() : 获取application对象。

  > HttpSession getSession() : 获取session对象。

request对象:

  每一个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取

请求参数的重要途径。

  1、获取请求头/请求参数

  (web应用是请求/响应架构的应用,浏览器发送请求时通常会附带一些请求,还可能包含一些请求参数发送给服务器,

  服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP和Servlet取得请求参数的途径就是request。)

  request是HttpServletRequest接口的实例,它提供了如下的几个方法来获取请求参数。

  >String getParameter(String paramName) :获取paramName请求参数的值。

  >Map getParameterMap() : 获取所有请求参数名和参数值组成Map对象。

  >Enumeration getParameterNames() :获取所有请求参数名所组成的Enumeration对象。

  >String[] getParameterValues(String name) :paramName请求参数的值,当参数有多个值的时候,该参数方法返回多个参数值。

  

  HttpServletRequest提供了如下方法来访问请求头:

  >String getHeader(String name):根据指定请求头的值。

  >Enumeration<STring> getHearderNames() :获取所有请求头的名称。

  >Enumeration<STring> getHearders(String name) :获取请求头的多个值。

  >int getIntHeader(String name):获取指定请求头的值,并将该值转化为整数值。

  客户端发送参数通常分为两种情况:

  GET方式请求:GET方式的请求会将请求参数的名和值转换成字符串,并附加在原URL之后,且GET请求传送的数据量比较小。

  POST方式请求:通常使用提交表单的方式来发送,且需要在form元素的method属性设置为post。POST请求传输的数据量总

          GET传输的数据量大。

  

<%@ 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">
<html>
<head>
<title>收集参数</title>
</head>
<body>
<form id = "form_1" method = "post" action = "requestTest_1.jsp">
姓名:<br/>
<input type = "text" name = "name" ><hr/>
性别:<br/>
男:<input type = "radio" name = "gender" value = "男">
女:<input type = "radio" name = "gender" value = "女"><hr/>
年龄:<br>
<input type = "text" name = "age"><hr>
最喜欢的颜色:<br>
红:<input type = "checkbox" name = "color" value = "红" >
绿:<input type = "checkbox" name = "color" value = "绿" >
蓝:<input type = "checkbox" name = "color" value = "蓝" ><hr>
博客:<br>
<input type = "text" name = "blog"><hr>
来自的国家:<br>
<select name = "country">
<option value = "中国">中国</option>
<option value = "美国">美国</option>
</select><hr>
<input type = "submit" value = "提交">
<input type = "reset" value = "重置">
</form>
</body>
</html>
<!--requestTest_1.jsp-->
<%@page import="java.util.Enumeration"%>
<%@ 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">
<html>
<head>
<title>获取请求参数/请求头</title>
</head>
<body>
<%
//获取所有请求头的名称:
Enumeration<String> headerNames = request.getHeaderNames() ;
while (headerNames.hasMoreElements())
{
String headerName = headerNames.nextElement() ;
//获取每个请求、以及其对应的值
out.println(headerName + "-->" + request.getHeader(headerName)+"<br>") ;
}
out.println("<hr>") ;
//设置解码方式
request.setCharacterEncoding("UTF-8") ;
//下面一次获取表的单体值
String name = request.getParameter("name") ;
String gender = request.getParameter("gender") ;
String age =request.getParameter("age") ;
//如果某个参数有多个值,将使用该方法获取多个值
String[] color = request.getParameterValues("color") ;
String blog = request.getParameter("blog") ;
String national = request.getParameter("country") ;
%>
<!-- 下面一次输出参数值 -->
名字:<%=name %><hr>
性别:<%=gender %><hr>
年龄:<%=age %><hr>
blog:<%=blog %><hr>
喜欢的颜色:<%for (String c : color){out.println(c + " ");} %><hr>
国家:<%=national %><hr>
</body>
</html>

  2、操作request范围的属性

  HttpServletRequset还包含如下两个方法,用于设置和获取request范围的属性。

  >setAttribute(String serName , Object attValue): 将attValue设置成request范围的值。

  >Object getAttribute(String attName) : 获取request范围的属性。

  当forward用户请求时,请求的参数和请求属性都不会丢失,即forward动作还是原来的请求,并没有在此向服务器发送请求。

  3、执行forward或include

  request还有一个共能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令。

  HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是forward或者include的目标路径。

  该方法返回RequestDispatcher,该对象提供了如下的两个方法。

  >forward(ServletRequest request , ServletResponse respone) ;  执行forward 。

  >include(ServletRequest request , ServletResponse respone) ; 执行include .

  例子:  getRequestDispatcher("/a.jsp").include(request, response) ;

  注意:使用request的getRequestDispathcher(String path)方法时,path字符串必须以斜线开头。

response对象:  

  response 代表服务器对客户端的响应。大部分时候,程序无须使用respone来响应客户端请求,

因为有个更简单的响应对象——out,代表页面的输出流。

  由于out无法输出非字符串(out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流),所以当需要在JSP页面中动态的

生成一幅位图、或者输出一个PDF文档,则必须使用response作为响应输出。

  1、response响应生成非字符串响应。

  img.jsp:

<%-- 通过contentType 指定响应的数据是图片 --%>
<%@ page language="java" contentType="image/jpeg" %>
<%@ page import = "java.io.*,java.awt.*,javax.imageio.*,java.awt.image.*" %>
<%
//建立一个BufferedImage对象
BufferedImage image = new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB) ;
//通过Image对象获得一个Graphics对象
Graphics graphics = image.getGraphics();
//使用Graphics画图,所画的图像,将会出现在image对象中。
graphics.fillRect(0,0,400,400) ;
//设置成红色
graphics.setColor(new Color(255,0,0)) ;
/*
画弧线
public abstract void fillArc(int x,
int y,
int width,
int height,
int startAngle,
int arcAngle)
参数:
x - 要填充弧的左上角的 x 坐标。
y - 要填充弧的左上角的 y 坐标。
width - 要填充弧的宽度。
height - 要填充弧的高度。
startAngle - 开始角度。
arcAngle - 相对于开始角度而言,弧跨越的角度。 */
graphics.fillArc(20,20,100,100,30,120) ;
//设置成绿色
graphics.setColor(new Color(0,255,0)) ;
graphics.fillArc(20,20,100,100,150,120) ;
//设置成蓝色
graphics.setColor(new Color(0,0,255));
graphics.fillArc(20,20,100,100,270,120) ;
//设置成黑色
graphics.setColor(new Color(0,0,0)) ;
/*
设置字体。
public abstract void setFont(Font font)
将此图形上下文的字体设置为指定字体。使用此图形上下文的所有后续文本操作均使用此字体。 Font(String name, int style, int size)
根据指定名称、样式和磅值大小,创建一个新 Font。
*/
graphics.setFont(new Font("Arial Black" , Font.PLAIN , 16)) ;
//画出三个字符串
graphics.drawString("red", 50,50);
graphics.drawString("green", 20,80);
graphics.drawString("blue", 80,80);
graphics.dispose() ;
//将图象输出到页面的响应
ImageIO.write(image, "jpg", response.getOutputStream()) ;
%>

  在标签中使用<img src = "img.jsp"> 便可以显示出上面代码的图片。实例:网页上的图形验证码功能。同时使用response生成PDF文件、Excel文件等等。

  2、重定向

  重定向是response的另外一个用处,与forward不同的是,重定向会丢失所有的请求数据,包括request范围的属性。

  HttpServletRespone提供了一个sendRedirect(String path)方法,重定向到path资源,即重新向path资源发送请求。

  其中,与forward的区别如下:

转发(forward) 重定向(redirect)

执行forward后依然是上次请求。

     执行redirect后是第二次请求。

forward的目标页面可以访问原请求的请求参数,因为依然是同一次

请求,所有原请求的请求参数、request范围的属性全部都存在。

     全部丢失。
     地址中的URL不会改变      改变

  3、增加Cookie

  response对象提供了如下方法来增加Cookie。

  void addCookie(Cookie cookie):增加Cookie。

  增加Cookie之前,必须创建Cookie对象。增加步骤如下:

  1、创建Cookie实例,Cookie的构造器为Cookie(String name , String value).

  2、设置Cookie的生命期限。

  3、向客户端写Cookie。

  

<%@ 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">
<html>
<head>
<title>增加Cookie</title>
</head>
<body>
<%
//获取请求参数
String name = request.getParameter("name") ;
//以获取的请求参数为值,创建一个Cookie对象
Cookie cookie = new Cookie("useName" , name) ;
//设置Cookie的生存期限
cookie.setMaxAge(24*3600) ;
//向客户端增加Cookie对象
response.addCookie(cookie) ;
%>
</body>
</html>

  访问客户端Cookie使用request对象,request对象使用了getCookie()方法,该方法将返回客户端机器上所有Cookie组成数组,

遍历该数组的每一个元素,找到希望可以访问的Cookie即可。

session对象:

  session是javax.servlet.http.HttpSession 的实例 , 该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端

关闭浏览器时,会话结束。

  session通常用于跟踪用户的会话信息,session范围内的属性可以在多个页面的跳转之间共存。

  >setAttribute(String attName , Object attValue) :设置session 范围内attName属性的值为attValue 。

  >getAttribute(String attName):返回session范围内attName属性的值。

    

<%@ 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">
<html>
<head>
<title>商品列表</title>
</head>
<body>
<!-- 建立一个表,列举出商品 -->
<form method = "post" action="processBuy.jsp">
书籍:<input type = "checkbox" name = "item" value = "book" /><br>
电脑:<input type = "checkbox" name = "item" value = "compute"/><br>
<input type = "submit" value = "buy" >
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %>
<%
//取出session范围的ItemMap属性
Map<String , Integer> itemMap = (Map<String , Integer>)session.getAttribute("itemMap");
//如果Map对象为空,则初始化Map对象
if(itemMap == null)
{
itemMap = new HashMap<String , Integer>() ;
itemMap.put("书籍", 0) ;
itemMap.put("电脑", 0) ;
} //获取上一个页面的请求参数
String[] buys = request.getParameterValues("item") ;
//遍历数组的各元素
for(String item : buys)
{
if(item.equals("book"))
{
int num = itemMap.get("书籍").intValue() ;
itemMap.put("书籍", num + 1) ;
}
else if(item.equals("compute"))
{
int num = itemMap.get("电脑").intValue() ;
itemMap.put("电脑", num + 1) ;
}
}
//将itemMap对象放到设置成session范围的itemMap属性
session.setAttribute("itemMap", itemMap) ;
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>购物车</title>
</head>
<body>
您购买的商品:<br>
书籍:<%=itemMap.get("书籍") %>本<br>
电脑:<%=itemMap.get("电脑") %>台<br>
<p><a href = "shop.jsp">再次购买</a></p>
</body>
</html>

JSP/Servlet(一)的更多相关文章

  1. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  2. JS.中文乱码,Jsp\Servlet端的解决办法

    JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21|  分类: Extjs |  标签:encodeuricomponent  乱码  urldecoder   ...

  3. 最简单的jsp+servlet的增删改查代码

    package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  4. JSP+Servlet中使用jspsmartupload.jar进行图片上传下载

    JSP+Servlet中使用cos.jar进行图片上传 upload.jsp <form action="FileServlet" method="post&quo ...

  5. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  6. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  7. JSP+Servlet+javabean+oracle实现页面多条件模糊查询

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  8. JSP+Servlet+javabean+mysql实现页面多条件模糊查询

    需求: 一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法: 需要实现的界面原型:要满足条件: 1.单选分类,点GO按扭 2.单独输入标 ...

  9. 淘宝(阿里百川)手机客户端开发日记第十一篇 JSP+Servlet

    由于本人从事.net开发已有多年经验,今天由于工作需要,我只能学习下JSP+Servlet,至于java web提供了更好的开发框架MVC,现在由于时间关系,我只好用JSP+Servlet来搭建服务器 ...

  10. JSP/Servlet的编码原理

    转自:http://janwer.iteye.com/blog/150226 首先,说说 JSP/Servlet 中的几个编码的作用 在 JSP/Servlet 中主要有以下几种设置编码的方式: pa ...

随机推荐

  1. Java枚举的3类语法

    一.最基本的用法 public enum TestEnum { IMG,TEXT,WORD } 使用时: TestEnum testEnum=TestEnum.WORD; System.out.pri ...

  2. Commons Codec基本使用(转载)

    在实际的应用中,我们经常需要对字符串进行编解码,Apache Commons家族中的Commons Codec就提供了一些公共的编解码实现,比如Base64, Hex, MD5,Phonetic an ...

  3. Quartz总结(二):定时任务中使用业务类(XXService)

    零.引言 上一篇文章:讲到了Spring集成Quartz的几种基本方法. 在实际使用的时候,往往会在定时任务中调用某个业务类中的方法,此时使用QuartzJobBean和MethodInvokeJob ...

  4. 转 linux目录介绍

    以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...

  5. CCS设计手段——相对定位

    1.认识相对定位 相对定位就是让元素相对自己原来的位置进行位置调整. 2.相对定位的本质特性 不脱标,老家留坑,形影分离. 3.用途 ①微调位置 ②做绝对定位的参考,子绝父相 4.相对定位的定位置 相 ...

  6. (简单) POJ 2387 Til the Cows Come Home,Dijkstra。

    Description Bessie is out in the field and wants to get back to the barn to get as much sleep as pos ...

  7. CABasicAnimation 基本动画

    几个可以用来实现热门APP应用PATH中menu效果的几个方法 +(CABasicAnimation *)opacityForever_Animation:(float)time //永久闪烁的动画 ...

  8. APP导致界面卡死,iPhone卡死

    实测,是 Reachability 类创建实例过多导致 http://stackoverflow.com/questions/34063166/ios-9-app-freeze-with-consol ...

  9. 谈谈MySQL数据表的类型(转)

    谈谈MySQL数据表的类型 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其 ...

  10. Linux之文件过滤分割与合并

    文件过滤分割与合并 1.grep命令 grep(global regular expression print)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本, ...