Java Web程序设计

第一章 Servlet概述

动态网站特点:

交互性 自动更新 随机性

目前被广泛应用的三种动态网站技术:PHP ASP JSP 

B/S架构

在动态网站技术中,一般使用浏览器作为客户端,客户在浏览器中发出请求,Web服务器得到请求后查找资源,然后向客户返回一个结果;

servlet特点:

高效  方便 功能强大 良好的移植性

servlet生命周期的3个方法:

init()

service()

destroy()

Servlet生命周期阶段:

装载Servlet

创建Servlet

初始化

服务

销毁

request.setCharacterEncoding(“GBK”);

HttpServletRequest的getParameter(“参数名称”)获取表单、URL参数值

HttpServletResponse的getWriter()获取向客户端发送信息的输出流

HttpServletRequest的getHeader(“报头名称”)获取相关报头信息

 

Servlet处理请求数据

编写Servlet处理用户提交的表单数据

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
	public LoginServlet() {
		super();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 将输入转换为中文
		request.setCharacterEncoding("GBK");
		// 设置输出为中文
		response.setContentType("text/html;charset=GBK");
		// 获取输出流
		PrintWriter out = response.getWriter();
		// 获取表单数据
		String pass = request.getParameter("password");
		String user = request.getParameter("loginName");
		if ("admin".equals(user) && "123456".equals(pass)) {
			out.println("登录成功!");
		} else {
			out.println("登录失败!");
		}
	}
}

  设置响应报头,实现动态时钟

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DateServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException { // 获得一个向客户发送数据的输出流:
		response.setContentType("text/html; charset=GBK");// 设置响应的MIME类型。

		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");
		
		response.setHeader("Refresh", "1"); // 设置Refresh 的值。
		out.println("现在时间是:");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		out.println("<br/>" + sdf.format(new Date()));
		out.println("</body>");
		out.println("</html>");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}
}

重定向和请求转发是Servlet处理完数据后进行页面跳转的两种主要方式

请求转发是指将请求再转发到另一资源,此过程依然在同一个请求范围内,转发后浏览器地址内容不变

请求转发使用RequestDispatcher接口中的forward()方法实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应

RequestDispatcher rd =request.getRequestDispatcher(path);

rd.forward(request,response);

重定向

重定向是指页面重新定位到某个新地址,之前得请求失效,且跳转后浏览器地址栏内容将变为新的指定地址

重定向是通过HttpServletResponse对象的sendRedirect()来实现

response.sendRedirect(request.getContextPath()+"/myservlet")

两者区别:转发和重定向都可以是浏览器获得另外一个URL所指向的资源,区别是转发共享同一个请求对象,而重定向不共享同一个请求对象

 

第二章 Servlet会话跟踪

会话跟踪技术:

Cookie技术

Session技术

URL重写技术

隐藏表单域

Cookie的安全机制

Cookie不会以任何方式在客户端被执行

浏览器会限制来自同一个网站的Cookie数目

单个Cookie的长度是有限制的

浏览器限制了最多可以接受的Cookie数目

 

 

Cookie的创建使用

Cookie userCookie =new Cookie("uName",username);

response.addCookie(userCookie);

Cookie[] cookies=request.getCookies();

 

使用Cookie保存用户名和密码,当用户再次登录时,在相应的文本显示上次登陆时输入的信息

public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String cookieName = "userName";
		String cookiePwd = "pwd";
		// 获得所有cookie
		Cookie[] cookies = request.getCookies();
		String userName = "";
		String pwd = "";
		String isChecked = "";
		// 如果cookie数组不为null,说明曾经设置过
		// 也就是曾经登录过,那么取出上次登录的用户名,密码
		if (cookies != null) {
			// 如果曾经设置过cookie,checkbox状态应该是checked
			isChecked = "checked";
			for (int i = 0; i < cookies.length; i++) {
				// 取出登录名
				if (cookies[i].getName().equals(cookieName)) {
					userName = cookies[i].getValue();
				}
				// 取出密码
				if (cookies[i].getName().equals(cookiePwd)) {
					pwd = cookies[i].getValue();
				}
			}
		}
		response.setContentType("text/html;charset=GBK");
		PrintWriter out = response.getWriter();
		out.println("<HTML>\n");
		out.println("<HEAD><TITLE>登录</TITLE></HEAD>\n");
		out.println("<BODY>\n");
		out.println("<CENTER>\n");
		out.println("	<FORM ACTION='CookieTest'" + " METHOD='POST'>\n");
		out.println("姓名:<INPUT TYPE='TEXT'" + " NAME='UserName' VALUE='"
				+ userName + "'><BR>\n");
		out.println("密码:<INPUT TYPE='PASSWORD' NAME='Pwd' VALUE='" + pwd
				+ "'><BR>\n");
		out.println("保存用户名和密码<INPUT TYPE='CHECKBOX'"
				+ "NAME='SaveCookie' VALUE='Yes' " + isChecked + ">\n");
		out.println("		<BR>\n");
		out.println("		<INPUT TYPE=\"SUBMIT\">\n");
		out.println("	</FORM>\n");
		out.println("</CENTER>\n");
		out.println("</BODY>\n");
		out.println("</HTML>\n");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

 

public class CookieTest extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		Cookie userCookie = new Cookie("userName", request
				.getParameter("UserName"));
		Cookie pwdCookie = new Cookie("pwd", request.getParameter("Pwd"));
		if (request.getParameter("SaveCookie") != null
				&& request.getParameter("SaveCookie").equals("Yes")) {
			userCookie.setMaxAge(7 * 24 * 60 * 60);
			pwdCookie.setMaxAge(7 * 24 * 60 * 60);
		} else {
			//删除Cookie
			userCookie.setMaxAge(0);
			pwdCookie.setMaxAge(0);
		}
		response.addCookie(userCookie);
		response.addCookie(pwdCookie);
		PrintWriter out = response.getWriter();
		out.println("Welcome," + request.getParameter("UserName"));

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

session的创建

HttpSessionsession=request.getSession();
或
HttpSessionsession=request.getSession(true);

session的生命周期

1、客户端向服务器第一次发送请求的时候,request中并无SessionID。

2、此时服务器会创建一个Session对象,并分配一个SessionID。Serssion对象保存在服务器端,此时为新建状态,调用session.isNew()返回true。

3、当服务器端处理完毕后,会将SessionID通过response对象传回到客户端,浏览器负责保存到当前进程中。

4、当客户端再次发送请求时,会同时将SessionID发送给服务器。

5、服务器根据传递过来的SessionID将这次请求(request)与保存在服务器端的Session对象联系起来。此时Session已不处于新建状态,调用session.isNew()返回false。

6、循环执行过程3-5,直到Session超时或销毁。

session的使用

session.setAttribute("uName",username);

String username=(String)session.getAttribute("uName");

session.invalidate();

Session演示用户在初始化页面输入一个值,单击提交按钮进入第一个Servlet。第一个servlet将输入的值分别保存到request和session,在第二个servlet从request和session对象中提取信息并显示

public class FirstServlet extends HttpServlet {
	public FirstServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//设置请求的编码字符为GBK
		request.setCharacterEncoding("GBK");
		//设置响应的文本类型为html,编码字符为GBK
		response.setContentType("text/html; charset=GBK");
		PrintWriter out = response.getWriter();
		//获取表单数据
		String str = request.getParameter("count");
		request.setAttribute("request_param", str);
		HttpSession session = request.getSession();
		session.setAttribute("session_param", str);	
		//out.println("<a href='s2'>下一页</a>");
		out.println("<a href="+response.encodeURL("s2")+">下一页</a>");
	}

}
//获取表单数据
		String str = request.getParameter("count");
		request.setAttribute("request_param", str);
		HttpSession session = request.getSession();
		session.setAttribute("session_param", str);	

 

public class SecondeServlet extends HttpServlet {

	public SecondeServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Object obj = request.getAttribute("request_param");
		String request_param = null;
		if (obj != null) {
			request_param = obj.toString();
		} else {
			request_param = "null";
		}
		HttpSession session = request.getSession();
		Object obj2 = session.getAttribute("session_param");
		String session_param = null;
		if (obj2 != null) {
			session_param = obj2.toString();
		} else {
			session_param = "null";
		}

		response.setContentType("text/html; charset=GBK");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body >");
		out.println("<h2>请求对象中的参数是 :" + request_param + "</h2>");
		out.println("<h2>Session对象中的参数是 :" + session_param
				+ "</h2></body></html>");

	}

}

 

ServletContext接口

// 获得ServletContext对象
ServletContext ctx = this.getServletContext();
// 获得web.xml中设置的初始化参数
String serverName = ctx.getInitParameter("serverName");
String dbInstance = ctx.getInitParameter("dbInstance");
String userName = ctx.getInitParameter("userName");
String password = ctx.getInitParameter("userPwd");

ServletContext的生命周期

1.新Servlet容器启动的时候,服务器端会创建一个ServletContext对象;

2.在容器运行期间ServletContext对象一直存在;

3.当容器停止时,ServletContext的生命周期结束。

ServletConfig接口

ServletConfig sc = getServletConfig();
name = sc.getInitParameter("userName ");

HttpSession、 ServletContext使用getAttribute()和setAttribute()方法读写数据

关闭浏览器、调用Session的invalidate()方法或者等待Session超时都可以使Session失效

第三章 JSP基础

 

 

JSP与Servlet的比较如下: 

JSP是一种服务器端脚本语言,它降低了Servlet的使用难度。JSP在本质上就是Servlet 。

JSP提供了Servlet能够实现的所有功能,实际上JSP是首先被翻译成Servlet后才编译并运行的,所以JSP几乎拥有Servlet的所有优点。

与Servlet相比,JSP更加适合制作动态页面,因为单纯使用Servlet开发动态页面是相当繁琐的。

JSP特点  

简单快捷

动态内容的生成和显示相分离

组件重用

易于部署、升级和维护 

JSP执行原理

客户端发出请求

容器接受请求后,检索对应的JSP页面,如果JSP页面第一次被请求,则容器将其翻译成一个Java文件,即Servlet

容器将翻译后的Servlet源代码编译形成字节码,即.class文件,并加载到内存执行

最后把执行结果发送回客户端

 JSP文件基本元素组成

JSP指令

JSP声明

JSP表达式

JSP脚本

JSP动作

JSP注释

ØJSP的执行过程需要经过翻译、编译、执行三个步骤

ØJSP指令用来向JSP容器提供编译信息

ØJSP声明用于在JSP中定义变量和方法

ØJSP表达式用于将Java表达式的运行结果输出在页面中

ØJSP脚本用于在JSP页面中插入Java代码

ØJSP提供了很多动作标签实现特定的功能

JSP输出100以内的质数 

<% 
int m,i,j;   
boolean f; 
for(i=2;i<=100;i++) {
f=true;
m=(int)Math.sqrt(i); 
for(j=2;j<=m;j++)  
if(i%j==0) { 
f=false;break; 
} } 
if (f)  
out.print(i+" ");
 %>

第四章 JSP指令和动作

page指令 import session errorpage buffer autoFlush

include指令

taglib指令

JavaBean

可重用

升级方便

不依赖于平台

非可视化的JavaBean可分为

业务Bean

数据Bean

 

JavaBean实际上就是一种满足特定要求的Java类:

是一个公有类,含有公有的无参构造方法;

属性私有;

属性具有公有的getset方法。

 <jsp:useBean>

<jsp:useBean id="name" class="className" scope="scope" />
或
<jsp:useBean id="name" type="className" scope="scope" />

<jsp:setProperty> 

<jsp:setProperty name="id" property="属性名" value="值"/>
或
<jsp:setProperty name="id" property="属性名" param="参数名"/>

<jsp:getProperty>

<jsp:getProperty name="user" propery="name"/>

使用useBean标准动作创建该类的对象,并使setProperty标准动作将登陆表单中的信息保存到该对象中,同时使用getProperty动作显示信息

<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form method="POST" name="f1" action="showbean.jsp">
<p align="left">用户名:<input type="text" name="loginName" size="20"></p>
<p align="left">密&nbsp; 码:<input type="password" name="password"
	size="20"></p>
<p align="left"><input type="submit" value="提交">&nbsp; <input
	type="reset" value="重置"></p>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
<head>
<title>JSP动作</title>
</head>
<body>
<jsp:useBean id="user" class="com.dh.ch04.model.UserBean" scope="request"/>
<jsp:setProperty property="name" name="user" param="loginName"/>
<jsp:setProperty property="pwd" name="user" param="password"/>
用户名:<jsp:getProperty property="name" name="user"/><br/>
密码:<jsp:getProperty property="pwd" name="user"/>
</body>
</html>

 <jsp:include>

<jsp:include page="被包含文件的URL"%>

<jsp:forward>和<jsp:param>

<jsp:forward page="URL地址"/>

<jsp:param name="参数名" value="值"/>

JavaBean需要满足公有类、公有无参构造方法、私有属性、属性对应的get/set方法几个要求 

useBean标准动作用来查找或者实例化一个JavaBean

setProperty标准动作用于设置JavaBean中的属性值

getProperty动作用于访问一个bean的属性并将其输出

include标准动作用于在JSP页面动态包含其他页面

forward标准动作用于将请求转发到另一个资源

param标准动作用于为其他动作标签提供附加参数信息,该动作可以与<jsp:include>、<jsp:forward>等一起使用

 

include指令和include标准动作的区别

在servlet中,可以include另外一个资源,其一是静态Include另一种是动态Include

静态Include是JSP指令标记

<%@include file="head.htm"%>

其中file可以是HTML文件、Servlet文件或者另外一个JSP文件

动态Include

<jsp:include page="bottom.html"%>

include 标准动作用于JSP页面,动态包含其他页面,该动态的功能和JSP的include指令类似

区别在于include指令是在编译时完成包含,是静态包含,而include标准动作是在运行时完成包含,是动态包含

第五章 JSP内置对象

out

常用方法有print()、println()和write()

void clear():清除缓冲区的内容,如果缓冲区已经被刷出(flush),将抛出IOException ;

void clearBuffer():清除缓冲区的当前内容,和clear()方法不同,即使缓冲区已经flush,也不会发生异常;

void flush():输出缓冲区中的内容;

void close():关闭输出流,清除所有内容。

request

信息显示页面

<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
<head>
<title>信息显示</title>
</head>
<body>
<%
    request.setCharacterEncoding("GBK");
	String name = request.getParameter("name");
	String sex = request.getParameter("sex");
	String xueli = request.getParameter("xueli");
	String[] channels = request.getParameterValues("channel");
%>
您输入的注册信息
<br />
<%
	out.print("姓名:" + name + "<br/>");
	out.print("性别:" + sex + "<br/>");
	out.print("学历:" + xueli + "<br/>");
	if (channels != null) {
		out.print("渠道:");

		for (int i = 0; i < channels.length; i++) {
			out.print(channels[i] + "&nbsp;");
		}
	}
%>
</body>
</html>

String getParameter(String name):根据参数名称得到单一参数值;

String[] getParameterValues(String name):根据参数名称得到一组参数值;

void setAttribute(String name, Object value):以名/值的方式存储数据;

Object getAttribute(String name):根据名称得到存储的数据。

response

void setContentType(String name):设置响应内容的类型和字符编码;

void sendRedirect(String url):重定向到指定的URL资源。

<%
    response.setContentType("text/html;charset=GBK");
    response.sendRedirect("response2.jsp");
%>

session

void setAttribute(String name, Object value):以名/值的方式存储数据;

Object getAttribute(String name):根据名称得到存储的数据。

session.setAttribute("name", "haier");
String name = (String)session.getAttribute("name");

application

void setAttribute(String name, Object value):以名/值的方式存储数据;

Object getAttribute(String name):根据名称得到存储的数据。

application.setAttribute("number", 1);
Integer i = (Integer) application.getAttribute("number"); 

page

<%@ page language="java" contentType="text/html; charset=GBK"
	info="测试page对象"%>
<html>
<body>
<%=((HttpJspPage)page).getServletInfo()%>
</body>
</html>

pageContext

void setAttribute(String name, Object value):以名/值方式存储数据

Object getAttribute(String name):根据名称得到存储的数据

void setAttribute(String name, Object value):以名/值方式存储数据
Object getAttribute(String name):根据名称得到存储的数据

pageContext、Session和Application的区别如下:

pageContext访问范围是当前JSP页面,所以计数始终为1;

session访问范围是当前会话,所以当刷新页面时,计数不断变化,但新打开一个窗口时,会新建一个会话,所以计数又从1开始;

application访问范围是整个应用程序,所以计数不断变化。

config

exception

JSP中有9个内置对象,无须定义,可以直接使用

out对象是一个输出流,用于将信息输出到网页中

request对象封装了当前请求信息,可以存取数据

response对象封装了当前响应信息

session对象表示当前会话,可以存取数据

application对象表示整个应用程序,可以存取数据

pageContext对象表示当前JSP页面,可以存取数据

JSP的4种作用范围分别使用pageContext、request、session、application来表示,它们都具有getAttribute()和setAttribute()方法

 

在servlet的doGet()和doPost()方法,如何得到JSP内置对象     out request response session application 分别对应的对象?

out :PrintWriter out = response.getWriter();

Servlet:可直接使用

session:HttpSession session=request.getSession();

application:ServletConfig.getServletContext();

ServletContext application =this.getServletContext();

 

 

 

第六章 EL和JSTL

 

可访问JSP的内置对象

简化了JavaBean的访问方式

简化了对集合的访问方式

可以通过关系、逻辑和算数运算符进行运算

条件输出

EL使用

<jsp:useBean id="person" class="com.haiersoft.entity.Person"
	scope="request" />
<jsp:setProperty name="person" property="name" value="zhangsan" />
<jsp:setProperty name="person" property="age" value="25" />

姓名:${person.name}
<br />
年龄:${person.age}

JSTL优点

针对JSP开发中频繁使用的功能提供了简单易用的标签,从而简化了jsp开发

作为JSP规范,以统一的方式减少了JSP中的Java代码数量,力图提供一个无脚本环境,

在应用程序服务器之间提供了一致的接口,最大程度地提高了web应用在各应用服务器之间的可移植性

 

在JSP页面中使用标签库,需要使用taglib指令导入,格式如下:

       <%@taglib uri="标签库uri路径" prefix="前缀名"%>

 

核心标签库(通用标签 条件标签 迭代标签 URL标签)

国际化输出标签库(I18N标签库)

XML标签库

SQL标签库

EL函数库

通用标签:

<c:out>

<c:set>

<c:remove>

<c:catch>

条件标签:

<c:if>

<c:choose>

<c:when>

<c:otherwise>

迭代标签

<c:forEach>

<c:forTokens>

URL标签

<c:import>

<c:redirect>

<c:url>

18N标签有:

<fmt:setLocale>、<fmt:bundle>、

<fmt:setBundle>、<fmt:message>、

<fmt:formatNumber>、<fmt:formatDate>

 

EL函数主要提供了对字符串处理的功能,此外还可以利用EL函数获取集合的大小

 

 

第七章:监听和过滤

监听器(Listener)可以监听客户端的请求、服务器端的操作。监听器可以在事件发生时自动执行操作。

上下文监听器执行流程

1.Web应用启动的时候,contextInitialized()方法进行初始化;

2.如果在Application范围内添加一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeAdded()方法进行处理;

3.如果在Application的范围内修改属性值,将会触发ServletContextAttributeEvent事件,通过AttributeReplaced()方法进行处理;

4.如果在Application的范围内删除一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeRemoved()方法进行处理;

5.Web应用关闭时,contextDestroyed()方法进行卸载。

 

过滤器:

实现过滤器的步骤如下:

1.创建一个实现Filter接口的类,并且实现接口中的init()、doFilter()和destroy()三个方法;

2.在doFilter()方法中编写过滤的任务代码;

3.调用FilterChain参数的doFilter()方法;

4.在web.xml注册这个Filter,以及其将过滤的页面。

 

Servlet上下文监听接口有ServletContextListener和  ServletContextAttributesListener。

Session会话的监听接口有:HttpSessionListener、  HttpSessionActivationListener、HttpSessionBindingListener和  HttpSessionAttributeListener。

请求对象的监听接口有ServletRequestListener和  ServletRequestAttributeListener。

过滤器类必须实现Filter接口。

doFilter()方法是Filter类的核心方法。

FilterChain(过滤器链)表示资源请求调用时过滤器的链表

 

第八章 Ajax基础

AJAX(Asynchronous JavaScript And XML,异步JavaScript和XML)是一种运用JavaScript和XML在浏览器和服务器之间传输数据的技术

AJAX的优点如下

异步请求

局部刷新

减轻服务器压力

增强用户体验

AJAX并不是一项全新的技术,而是整合了几种现有的技术

JavaScript

XML

CSS

DOM

 

XMLHttpRequest对象的运行周期经过以下几个过程 :

1.创建

2.初始化请求

3.发送请求

4.接收数据

5.解析数据

6.完成

AJAX是异步、无刷新的网站技术

AJAX主要包括JavaScript、CSS、DOM、XML和XMLHttpRequest

XMLHttpRequest对象可以进行异步数据读取

使用XMLHttpRequest对象的属性、方法进行编程实现动态无刷新效果

使用AJAX技术时,通常使用XML或JSON格式来封装结构化的数据

 

 

 

request方法:

Request
1>获取请求的基本信息
1>获取请求的url和uri
2>获取url后面的请求参数部分的字符串
3>获取请求方式
4>获取主机名,IP地址
5>获取 Contexpath

String url = request.getRequestURL().toString();
System.out.println(url);

String uri = request.getRequestURI().toString();
System.out.println(uri);

String params = request.getQueryString();
System.out.println(params);

String method = request.getMethod();
System.out.println(method);

String addr = request.getRemoteHost() + request.getRemotePort() + request.getRemoteAddr() +
    "==user=" + request.getRemoteUser();
System.out.println("addr: " + addr);

String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/index.jsp");

2.获取请求参数

Map<String, String[]> params = request.getParameterMap();
for (String name : params.keySet()) {
   String value = request.getParameter(name);
   System.out.println("name=" + name + ", value=" + value);
}

解决请求乱码问题:

request.setCharacterEncoding("Utf-8");

如果上面的代码只能解决POST的乱码问题, 则可以自行进行解码操作

String userName = request.getParameter("username");
userName =  new String(userName.getBytes("ISO8859-1"), "UTF-8");

前段使用 UTF-8 进行编码, 传输到服务器, 服务器可以使用 ISO8859-1 解码得到UTF-8编码后的码值, 然后通过new String(bytes, charset)的方式进行解码.

3.设置和获取域属性

Object attr = request.getAttribute("attr");
request.setAttribute("key", "value");
request.removeAttribute("attr");
Enumeration<String> attributeNames = request.getAttributeNames();

一般我们的应用是servlet处理数据, 将处理好的数据放到request域中,然后带到jsp页面上进行展示操作.

请求转发与请求包含
请求转发:

request.getRequestDispatcher("/DispatcherTest2").forward(request, response);
或
this.getServletContext().getRequestDispatcher("/DispatcherTest2").forward(request, response);


 

 

Response

response.getOutputStream().write("中国".getBytes("utf-8"));

response.getWriter().write("北京");

response.setCharacterEncoding("utf-8");

response.setHeader("Content-Type", "text/html;charset=utf-8");

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

 

    1.Servlet实现

response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功, 3秒后回到主页");
response.setHeader("Refresh", "3;url=OutServlet");


  2.html实现

<meta charset="UTF-8">
<meta http-equiv="Refresh" content="3; url=index.jsp" >
<title>Insert title here</title>
</head>
<body>
    恭喜您注册成功, 3秒后回到主页....
</body>

5)控制浏览器是否缓存

response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.getWriter().write(new Date().toLocaleString());

6)实现请求重定向

response.sendRedirect(this.getServletContext().getContextPath());

 

 

 

 

 

 

 

 

 

 

 

 

 

<>人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象的编程语言 3 1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用javascript与ajax提升用户体验 7 1.3多种集成开发环境 9 1.3.1集成开发环境简介 9 1.3.2web应用服务器说明 11 本章小结 14 课后练习 14 第2章 javaee运行及开发环境 15 2.1jdk的下载与安装 15 2.1.1jdk的下载与安装 15 2.1.2配置环境变量 17 >2.2tomcat的下载与安装 19 2.2.1下载并安装tomcat服务器 19 .2.2.2基本配置 22 2.2.3服务器页面介绍 23 2.3eclipse的下载与安装 24 2.3.1eclipse的下载与安装 24 2.3.2熟悉eclipse开发环境 24 2.4项目实战——第一个javaee应用:helloworld 28 2.4.1开始创建第一个javaee应用 28 2.4.2熟悉helloworld框架结构 29 本章小结 32 课后练习 32 第3章jsp和servlet 33 3.1开发第一个jsp+servlet应用 33 3.1.1创建工程 33 3.1.2编写程序 34 3.1.3部署应用 35 3.2认识jsp 36 3.2.1jsp的工作原理 37 3.2.2jsp注释方式 37 3.2.3jsp声明方式 38 3.2.4jsp表达式的应用 39 3.2.5jsp的脚本段 39 3.2.6jsp的编译指令 40 3.2.7jsp的动作指令 41 3.2.8jsp的内置对象 43 3.3认识servlet 46 3.3.1servlet的开发 46 3.3.2使用httpservlet 47 3.3.3servlet的生命周期 49 3.3.4load-on-startupservlet 50 3.4自定义标签库 51 3.5预处理用户请求:filter 53 3.6使用listener 56 3.7项目实战——用户登录 59 本章小结 62 课后练习 63 第4章sql与jdbc 64 4.1sql 64 4.1.1sql概述 64 4.1.2ddl与dml简介 64 4.1.3sql使用方法 65 4.2jdbc 67 4.2.1jdbc概述 67 4.2.2jdbc驱动程序 68 4.2.3使用jdbc读取数据 69 4.3项目实战——存储图书息 73 本章小结 78 课后练习 79 第5章struts2框架基础 80 5.1mvc框架 80 5.1.1model1与model2 80 5.1.2mvc设计模式 81 5.1.3struts2框架的mvc架构 82 5.2struts2概览 84 5.2.1struts2的工作流程 84 5.2.2struts2的简单应用 85 5.3struts2基础 87 5.3.1action详解 88 5.3.2结果与视图 91 5.3.3struts.xml的配置 94 5.4值栈与ognl表达式 100 5.5struts2的标签库 103 5.5.1控制标签 103 5.5.2数据标签 104 5.5.3表单标签 105 5.5.4非表单ui标签 107 本章小结 108 课后练习 109 第6章struts2高级应用 110 6.1拦截器 110 6.1.1拦截器工作机制 110 6.1.2拦截器及拦截器栈的应用 111 6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3输入校验 123 6.3.1输入校验的必要性 123 6.3.2编程方式实现输入校验 125 6.3.3应用struts2输入校验框架 128 6.3.4自定义校验器 130 6.4国际化 131 6.4.1国际化实现原理 131 6.4.2准备国际化资源文件 131 6.4.3调用国际化资源文件 134 6.5上传和下载 135 6.5.1文件上传的实现原理 135 6.5.2struts2文件上传实现方式 136 6.5.3struts2文件下载实现方式 141 本章小结 143 课后练习 144 第7章 struts2中应用模板语言 145 7.1模板语言简介 145 7.2应用velocity 146 7.2.1velocity基础 146 7.2.2struts2对velocity的支持 153 7.3应用freemarker 155 7.3.1freemarker基础 155 7.3.2struts2整合freemarker 166 7.3.3使用struts2标签设计模板 170 7.4freemarker与velocity的比较 171 本章小结 171 课后练习 172 第8章hibernate框架基础 173 8.1orm简介 173 8.1.1应用orm的意义 173 8.1.2流行的orm框架 174 8.2准备hibernate运行环境 174 8.2.1下载与安装hibernate 175 8.2.2hibernate发布包介绍 175 8.3认识hibernate 176 8.3.1hibernate框架结构 176 8.3.2hibernate配置文件 177 8.3.3configuration与sessionfactory 178 8.3.4session类 179 8.3.5hibernate中的关联关系 179 8.3.6hibernate映射文件 180 8.3.7hibernate工作原理 182 8.4项目实战——新闻内容显示 183 本章小结 186 课后练习 187 第9章hibernate查询 188 9.1hibernate的数据检索策略 188 9.1.1立即检索 188 9.1.2延迟检索 189 9.1.3预先检索 190 9.1.4批量检索 191 9.2hibernate的数据查询方式 193 9.2.1hql方式 193 9.2.2qbc方式 194 9.2.3原生sql方式 195 9.3hibernate的关联查询 196 9.3.1一对一关联关系的使用 196 9.3.2一对多、多对一关联关系的使用 197 9.3.3多对多关联关系的使用 199 9.4hibernate过滤 201 9.4.1session过滤 201 9.4.2filter过滤 201 9.5项目实战——客户订单管理 202 本章小结 207 课后练习 207 第10章hibernate性能优化 208 10.1hibernate事务与并发 208 10.1.1什么是事务 208 10.1.2hibernate中的事务处理 209 10.1.3在hibernate中使用jta事务 210 10.1.4并发控制 211 10.2hibernate缓存 213 10.2.1缓存的工作原理 213 10.2.2应用一级缓存 214 10.2.3应用二级缓存 214 10.2.4应用第三方缓存 216 10.3项目实战——借还图书 217 本章小结 224 课后练习 224 第11章spring框架基础 226 11.1spring框架概述 226 11.1.1认识spring框架 226 11.1.2spring框架特点 226 11.1.3spring框架核心架构 227 11.2建立spring开发环境 228 11.2.1下载spring框架 228 11.2.2spring发布包与软件包 229 11.2.3创建spring应用环境 230 11.3bean的装配 231 11.3.1bean基本配置 232 11.3.2为bean添加属性 232 11.3.3简化配置 233 11.4理解spring的核心——ioc 234 11.4.1控制反转 234 11.4.2依赖注入的3种方式 236 11.5beanfactory与applicationcontext 238 11.5.1认识beanfactory 238 11.5.2使用applicationcontext 238 11.6项目实战——spring问候程序 239 本章小结 241 课后练习 241 第12章springaop 242 12.1aop基础 242 12.1.1aop与oop的比较 242 12.1.2aop的核心概念 243 12.1.3java动态代理与aop 244 12.1.4springaop简介 245 12.2使用spring的通知 246 12.2.1beforeadvice 246 12.2.2afterreturningadvice 248 12.2.3methodinterceptor 249 12.2.4throwadvice 250 12.3使用spring的切入点 251 12.3.1静态切入点 251 12.3.2动态切入点 253 12.4springaop的代理工厂 253 12.4.1选择合适的代理 253 12.4.2proxyfactory 254 12.4.3proxyfactorybean 254 12.5项目实战——输出日志 256 本章小结 258 课后练习 259 第13章 spring与javaee持久化数据访问 260 13.1spring对dao模式的支持 260 13.1.1统一的数据访问异常 260 13.1.2通用的数据访问模板及抽象支持类 261 13.2spring的jdbc 262 13.2.1为什么需要jdbctemplate 262 13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的常用数据操作方法 264 13.3spring中的事务处理 265 13.3.1spring事务处理概述 266 13.3.2编程式事务处理 266 13.3.3声明式事务处理 267 13.3.4标注式事务处理 268 13.4项目实战——公司人事管理 269 本章小结 276 课后练习 276 第14章spring与struts2、hibernate框架的整合基础 277 14.1spring与struts2的整合方式 277 14.1.1struts2应用的扩展方式 277 14.1.2spring插件的应用 278 14.2spring和hibernate的整合 279 14.2.1spring对hibernate的支持 279 14.2.2管理sessionfactory 279 14.2.3hibernate的dao实现 281 14.2.4使用hibernatetemplate 281 14.2.5管理hibernate事务 282 14.3项目实战——学生成绩查询系统 283 本章小结 292 课后练习 293 第15章图书馆管理系统 294 15.1系统功能解析 294 15.2系统数据库设计 295 15.2.1数据库分析 295 15.2.2数据表关联关系分析 298 15.3系统框架搭建 300 15.3.1创建工程 300 15.3.2工程目录结构 300 15.4系统代码实现 302 15.4.1数据库连接的实现 303 15.4.2工具类的实现 304 15.4.3管理员登录与退出实现 306 15.4.4系统管理实现 313 15.4.5图书管理实现 319 15.4.6读者管理实现 329 15.4.7借还管理实现 333 15.4.8前台功能实现 336 本章小结 342
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值