Java Servlet 回顾
一、转发请求RequestDispatcher
使用request域对象把数据带给转发资源,与重定向的区别:客户端只发出一次请求,服务器端调用多个资源,客户端浏览器地址栏没改变;转发是一次请求,使用的是同一个response和request;
?
ServletContext.getRequestDispatcher(String);
ServletContext.getNamedDispatcher(String);
ServletRequest.getRequestDispatcher(String);
有两种方式:
resp.setContentType("text/html;charset=UTF-8");
resp.addHeader("refresh", "3;url='/W/index.html'");
resp.getWriter().write("恭喜登录成功,如果没有中转,请点击超链接<a href='/W/index.html'>AAAA</a>");
上面的代码在接收到请求后会显示一个登录成功的跳转提示,3s后会自动跳转到index.html页面;
String message = "<meta http-equiv='refresh' content='3;url=/W/index.html'><a href='/W/index.html'>AAAA</a>";
this.getServletContext().setAttribute("message", message);
this.getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);// 将消息(message)带到message.jsp页面进行显示;
编写URL技巧: 先写'/', 给服务器用的就不用写web应用程序名称;给浏览器用的就加上web应用程序名称
'/'代表当前web应用,写资源路径的时候先写'/'代表当前web应用;
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");// 得到资源绝对路径;
二、程序编码
程序response响应对象以什么码表输出,就一定要控制浏览器以什么码表打开;可以使用html中的meta技术模拟http响应头,来控制浏览器的行为;
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
也可以通过response响应对象来直接设置编码;
response.setCharacterEncoding("UTF-8");
// 设置response使用的码表,控制response以什么码表向浏览器写出数据;
response.setHeader("Content-type", "text/html;charset=UTF-8");
// 指定浏览器以什么码表打开数据;
更简洁的写法
response.setContentType("text/html;charset=UTF-8");
获取request请求参数,在知道请求参数的编码方式的前提下,可以对请求参数进行编码转换:
request.setCharacterEncoding("UTF-8"); // 只对Post方式有效
// get方式处理乱码
String value = request.getParameter("username");
String out = new String(value.getBytes("iso8859-1"), "UTF-8");
System.out.println(out);
解决中文乱码大概有以下几种方式:
1、decode()方法
java.net.URLDecoder.decode(s)
2、设置字符集的方式
request.setCharacterEncoding("utf-8");
3、在页面上定义charset的字符集
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.demo.filter.CoreFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5、在form表单里定义编码
accept-charset="utf-8" onsubmit="document.charset='utf-8';"
6、更改ContentTypes的值
改变eclipse里ContentTypes的值为utf-8
7、改变tomcat字符集
通过改变server.xml文件里的字符集来接收中文
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
三、设置session
Response.setDateHeader("expires", System.currentTimeMillis() + 1000*3600);// 设置session有效时间10分钟;
Response.getWriter().write(data);
Response.setHeader("refresh", "3");
四、压缩文件,告诉浏览器返回的是压缩文件
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout;
try {
gout = new GZIPOutputStream(bout);
gout.write("dd".getBytes());
gout.close();
} catch (IOException e) {
}
byte[] gzip = bout.toByteArray();
response.setHeader("Content-Encoding", "gzip");
response.setHeader("Length", gzip.length + "");
response.getOutputStream().write(gzip);
五、重定向
response.setStatus(302);//重定向
response.setHeader("Location", "/first/MyJsp.jsp");
// response.sendRedirect("/first/MyJsp.jsp");
* 浏览器会向服务器发送两次请求,浏览器地址栏会发生变化,用户登录的时候/显示购物车时通常会用到重定向
ServletConfig
ServletConfig为具体的某一个servlet的配置信息;
实际开发中,有一些东西不适合在servlet程序中写死,这类数据可以通过配置方式配给servlet,例如:servlet采用哪个码表,接连哪个数据库,加载哪个配置文件;
String value = this.getServletConfig().getInitParameter("name");
<servlet>
<init-param>
<param-name>name</param-name>
<param-value>XXXXX</param-value>
</init-param>
</servlet>
ServletContext
ServletContext:这是一个容器,容器的作用范围为整个应用程序;
一个web应用中的的所有servlet共享同一个ServletContext对象
String value = this.getServletContext().getInitParameter("datacontext");
<context-param>
<param-name>datacontext</param-name>
<param-value>xxdata</param-value>
</context-param>
如果读取资源文件的对象不是servlet的话,就只能通过类装载器读取文件,但资源文件不宜太大,类装载器只加载一次;
class userinfo {
static {
InputStream in = userinfo.class.getClassLoader().getResourceAsStream("db.properties");
String path = userinfo.class.getClassLoader().getResource("db.properties").getPath();
// 通过类装载的方式得到文件的位置,再通过传统方式去读取资源文件。
}
}
Servlet配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>FIle</servlet-name>
<servlet-class>com.test.FileServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>FIle</servlet-name>
<url-pattern>/file</url-pattern>
</servlet-mapping> </web-app>
Cookie & Session
request.getCookies();//获取所有cookie;
response.addCookie(cookie);//添加cookie // Session是通过cookie的方式传给浏览器;
HttpSession hs = request.getSession();
// 浏览器禁用了cookie的处理方法
String url1 = response.encodeURL("/CooSee/servlet/SeesionDemo1");
String url2 = response.encodeURL("/CooSee/servlet/SeesionDemo2");
out.print("<a href='" + url1 + "'>购买</a></br>");
out.print("<a href='" + url2 + "'>结账</a></br>"); request.getSession(false); // false,只获取,但不创建session;
Md5
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(String.getBytes());
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(md5);
Java Servlet 回顾的更多相关文章
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【Java】Java Servlet 技术简介
Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...
- Java基础回顾
学习基础背景:Acmer.有C/C++基础 以[Java语言程序设计(基础篇)]第10版为参考(感谢YJJ的推荐),列出部分知识点,注意思考背后的原因和好处坏处. [14-16章——关于可视化编程的章 ...
- java servlet 几种页面跳转的方法及传值
java servlet 几种页面跳转的方法及传值 java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.appli ...
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- java servlet调用带有多个返回结果集的存储过程
一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...
- java servlet+mysql全过程(原创)
前段时间写过一篇 servlet+oracle的文章,但是那是因为公司有可能接那么一个项目,然后我当时也比较闲,所以随便学了下,那玩意是白去研究了,因为公司后面并没接到那项目. 这次学servlet用 ...
- java servlet+oracle 新手可看
最近公司领导告诉接下去接的一个产品,可能会涉及到oracle数据库,以前用得最多的是mssql,前些时间学了下mysql也算少许用过.oracle没接触过.应为我之前做过.net开发,所以数据访问接口 ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
随机推荐
- poj1873 The Fortified Forest 凸包+枚举 水题
/* poj1873 The Fortified Forest 凸包+枚举 水题 用小树林的木头给小树林围一个围墙 每棵树都有价值 求消耗价值最低的做法,输出被砍伐的树的编号和剩余的木料 若砍伐价值相 ...
- [网络]让局域网的电脑通过路由的公网ip可以被访问到的设置
http://公网IP:服务端口/访问路径(http://110.16.166.135:8081/pra/unionpay/v_asyn_notify.jspx这个地址就会通过公网ip来访问到你的ip ...
- JS获取浏览器可视区域尺寸
本文所说的是浏览器窗口的可视区域大小,不是浏览器窗口大小,也非页面尺寸. 在没有声明DOCTYPE的IE中,浏览器显示窗口大小只能以下获取: document.body.offsetWidth doc ...
- ASP.NET- Repeater 嵌套
我们有时候需要查找出父菜单下面全部的子菜单,然后根据子菜单的ID查找出该类别下面的全部新闻. 通常往往只知道父级菜单的ID,但不知道父级菜单下面有多少个子菜单,也不知道子菜单的ID 所以我们往往需要根 ...
- 【JAVA - SSM】之MyBatis动态SQL
动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑.通常用到的动态SQL标签有<if>.<choose>.<where>.<trim>.<s ...
- Ubuntu 12.04 安装搜狗输入法
安装指南 Ubuntu / Ubuntu Kylin 14.04 LTS 版本 只需双击下载的 deb 软件包,即可直接安装搜狗输入法. Ubuntu 12.04 LTS 版本 由于 Ubuntu 1 ...
- SpringMVC + ehcache( ehcache-spring-annotations)基于注解的服务器端数据缓存
背景 声明,如果你不关心java缓存解决方案的全貌,只是急着解决问题,请略过背景部分. 在互联网应用中,由于并发量比传统的企业级应用会高出很多,所以处理大并发的问题就显得尤为重要.在硬件资源一定的情况 ...
- 标准I/O库之标准I/O的效率
程序清单5-1 用getc和putc将标准输入复制到标准输出 #include "apue.h" int main( void ) { int c; while(( c = get ...
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- linux安装java环境
在linux下安装JDK如下: 第一步:查看Linux自带的JDK是否已安装 (1)查看已经安装的jdk: [root@web-server ~]# rpm -qa|grep jdk ← 查看jdk的 ...