三月份27日 Servlet扩展

3月27日 Servlet扩展

Servlet加强

 

1.Path总结(路径总结):

(1)java项目:

File file = new file(“”);

   *在控制台上,使用java命令,输出路径是当前java命令所处的路径:工作台的路径\bin

  *在使用IDE运行时,仅为工作台路径,不含bin

将项目打成jar包 

右键Export-->Jar 保存

bin中的内容就是JAR中的内容

* “/” 相对路径,

相对于当前盘符的路径,即获取当前盘符

     * 获得路径使用类加载器

Hello.class.getClassLoader().getResource(“”); 返回URL,直接指到bin,即所在文件的根目录

Hello.class.getClassLoader().getResource(“\”); 不允许使用,返回null

 

2.ServletContext

* Context 上下文 

此对象是对当前web项目上下文的描述

InitServletConfig--> config.getServletContext()

Tomcat 为每一个项目都创建了一个区域,这个区域就是ServletContext

Tomcat中一个目录:

Webapps 用于存储项目,并对每一个项目分别进行管理

ServletContext 是一个接口

方法:

getRealPathpath) 给一个相对路径,返回真实路径

路径全部为字符串类型,不管文件是否存在,均可以表示出其真实路径:”WebName/Path”

创建Servlet复习:

1.写一个类,继承HttpServlet 

2.覆盖doGetdoPost

3.在web.xml中配置Servlet

init中,config.getServletContext() 可以引用内存

管理当前项目的所有文件

  获得实际路径,要求“\”开头:找到WebName下一级的目录

  //获得资源文件 

ServletContext  sc = this.getServletContext();

 //context root

当前ServletContext所指的web项目的根

Tomcat ----> webapps/webName

Myeclipse--->webName/WebRoot

获得资源

getResource(“/……”)   / 开头,返回URL

URL中的getPath方法可以将其转换为String类型

 

getResourceAsStream 返回一个输入流(InputStream

 

测试时用getResource,可以显示路径

编写时用getResourceAsStream 可以进行IO操作

 

ServletContext属性与配置

getRealPath 获取实际路径

·操作数据:
add set get remove delete

getAttribute(String name) 给名字返回属性值 

setAttributeString nameObject obj)给一个名字、值,设置属性值

removeAttributeString name)给一个名字,删除属性值

 

 

1、set部分

 

package cn.yswl.attr;

 

import java.io.IOException;

 

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class SetAttr extends HttpServlet {

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//获取ServletContext

ServletContext sc= this.getServletContext();

//设置属性值

sc.setAttribute("name""ly");

System.out.println("属性值配置成功!!!");

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

 

}

 

 

2.get部分

package cn.yswl.attr;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class GetAttr extends HttpServlet {

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//获取ServletContext

ServletContext sc= this.getServletContext();

//获取属性值

String value = (String) sc.getAttribute("name");

System.out.println("属性值获取成功!!!值为: "+value);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

 

}

 

·给当前项目配置内容:

配置文件的位置 web.xml 

配置内容(例如配置数据库:url、驱动,账号、密码等)

·使用标签(可配置多个)

<context-param>

<param-name></param-name>

<param-value></param-value>

</context-param> 

·读取配置的内容:

getInitParameter(name) 给名字,返回值

getInitParameterNames() 返回枚举类

 

Web的相对路径

前提:相对当前的页面

使用分类:

abc    与当前页面同级的目录或servlet

/abc    相对于web站点,……/webapps/

./abc    当前目录,与第一种情况相同 

../abc 上一级目录

 

3.ServletResponse

response(响应  服务器-->浏览器)将需要发送给浏览器的所有数据全部存放在此对象上。

 ·发送数据 使用流操作,将所需的数据存放在流中,发送给浏览器

·字节流 

将数据发送给浏览器

·1.获取流

·2.准备数据

·3.将数据写入到获得的流

 

package cn.yswl.date;

 

import java.io.IOException;

import java.util.Date;

 

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class GetDate extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/***********************************使用response,来进行从服务器到浏览器端数据的传输*************************/

//获取数据流

ServletOutputStream is = response.getOutputStream();

//准备数据

String date = new Date().toString();

//写入字

is.print(date);

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

 

}

 

总结: getOutputStreamgetWriter不能同时使用。

字节流:getOutputStream 一般在程序中使用具有拷贝功能

字符流:getWriter       一般在程序中发送数据内容的时候

 

response发送中文:

字节流发送中文:

·设置响应浏览器的编码 setContentType(“text/html; charset= 编码类型”)

······通知tomcat和浏览器都使用该编码类型

·在getBytes()中写入编码类型

 

package cn.yswl.date;

 

import java.io.IOException;

import java.util.Date;

 

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import sun.util.resources.CalendarData;

 

public class GetDate extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//获取流

ServletOutputStream out = response.getOutputStream();

response.setContentType("text/html;charset=UTF-8");

//获取数据

String data = "获取当前时间:"+new Date().toString();

//写入流

out.write(data.getBytes("UTF-8"));

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

 

}

 

·通过字符流进行数据的发送

1.获取字符流

2.创建数据

3.将数据写入字符流

 

package cn.yswl.date;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class NewCNServ extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//通过字符流进行服务器--->浏览器数据发送

//配置字符集

response.setContentType("text/html;charset=GB2312");

//获取字符流

PrintWriter pw = response.getWriter();

//创建数据

String data = "中文数据 GB2312字符集";

//写入字符流

pw.print(data);

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

 

}

 

 

4.ServletRequest

 

将数据从浏览器----->服务器,是数据存放的地方

 

GETPOST两种请求方式:

GET:数据追加在url中,适合于小文本

POST:在请求体中,安全性更高

浏览器---------->发送数据给服务器

 

 

表单form 属性: methodpost/get) action(接收数据的路径)

 

获取表单数据 request中的getParameter(name) 根据表单的name属性,返回值。

 

1.网页文件

package cn.yswl.date;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class FormPage extends HttpServlet {

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

PrintWriter printer = response.getWriter();

printer.print("<h3>表单练习</h3>");

printer.print("<form action=\"/WebDate/formData\" method=\"get\">");

printer.print("姓名:<input maxlength=\"25\" type=\"text\" name=\"usersname\"/>");

printer.print("密码:<input maxlength=\"25\" type=\"password\" name=\"userspwd\"/>");

printer.print("<input type=\"submit\" value=\"提交\"/>");

printer.print("</form>");

}

 

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

this.doGet(request, response);

}

 

}

 

2.提交数据

package cn.yswl.date;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class FormData extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String name = request.getParameter("usersname");

System.out.println("姓名: "+name);

String pwd = request.getParameter("userspwd");

System.out.println("密码:"+pwd);

System.out.println("加密后: "+pwd.hashCode()+12345);

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

}

 

}

 

 

单选项和多选项会返回标签的value

多选项 使用 getParamerValues() 

 

request处理中文

对于post: 需要通知tomcat用户提交的数据的字符集

request中的setCharacterEncodingString

配置字符集

 

对于get:  浏览器已经将中文进行编码,因此,我们需要在Servlet中对其进行解码:

获取用户get请求提交的数据:

getQueryString() 返回String

将其传入URLDecoder中的decodename,字符集)中的第一个参数

String str = request.getQueryString();

String next = URLDecoder.decode(str, "UTF-8");

System.out.println(next);

因此,在表单中使用中文的时候,不要使用get,处理很麻烦!!