老师,我这里的返回信息,还是出现乱码。这个编码格式设置应该在哪里定义或修改?
返回信息:

源码:
response类:
package Server;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import Util.IOCloseUtil;
/**
*响应类
*/
public class Response {//响应
private StringBuilder headInfo;//响应头
private StringBuilder content;//响应内容
private int length;//响应内容的长度
private BufferedWriter bw;//流
//两个常量、换行、空格
private static final String CRLF="\r\n";//换行
private static final String BLANK=" ";//空格
//构造方法
public Response() {
headInfo=new StringBuilder();
content=new StringBuilder();
}
//带参构造方法获得输出流
public Response(OutputStream os) {
this();//调用本类的无参构造方法,由于初始化变量
try {
bw=new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//构造正文部分,传什么就向content中添加什么,此方法不换行
public Response print(String info) {
content.append(info);
try {
length+=info.getBytes("utf-8").length;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return this;
}
//构造正文部分,此方法换行
public Response println(String info) {
content.append(info).append(CRLF);
try {
length+=(info+CRLF).getBytes("utf-8").length;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return this;
}
//构造响应头
private void createHeadInfo(int code) {
headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
//状态码信息描述
switch (code) {
case 200:
headInfo.append("OK");
break;
case 500:
headInfo.append("SERVER ERROR");
break;
default:
headInfo.append("NOT FOUND");
break;
}
headInfo.append(CRLF);
headInfo.append("Content-Type:text/html;charst=utf-8").append(CRLF);
headInfo.append("Content-Length:"+length).append(CRLF);
headInfo.append(CRLF);
}
/**
* 推送到浏览器端
*/
public void pushToClient(int code) {
if(headInfo==null) {
code=500;
}
//调用本类的构造方法
this.createHeadInfo(code);
try {
bw.write(headInfo.toString());
bw.write(content.toString());
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
IOCloseUtil.closeAll(bw);//关闭语句
}
}
server类:
package Server;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import Servlet.Servlet;
import Util.IOCloseUtil;
/**
*服务器类,用于启动、停止服务
*/
public class Server {
private ServerSocket server;
public static void main(String[] args) {
Server server=new Server();//创建服务器对象
server.start();
}
public void start() {
this.start(8888);
}
public void start(int port) {
try {
server=new ServerSocket(port);
this.receive(); //调用接收请求信息的方法
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//调用接收请求信息
private void receive() {
try {
//1、监听
Socket client=server.accept();
//2、获取用户的请求
//封装请求信息
Request req=new Request(client.getInputStream());
//对以下响应信息进行封装
/**
* 返回响应信息。做出响应。
*/
//响应头信息
/** StringBuilder sb=new StringBuilder();
sb.append("HTTP/1.1").append(" ").append(200).append(" ").append("登录成功。");
sb.append("Content-Type:text/html;charst=utf-8").append("\r\n");
//响应内容
String str="<html><head><title>响应结果</title><meta charset=\"utf-8\"/></head><body>登录成功!</body></html>";
sb.append("Content-Length:"+str.getBytes("utf-8").length).append("\r\n");
sb.append("\r\n");
sb.append(str);
//通过输出流发送出去
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8"));
bw.write(sb.toString());
bw.flush();
bw.close();
*/
//使用封装的响应方法
Response rep=new Response(client.getOutputStream());
Servlet servlet=WebApp.getServlet(req.getUrl());
int code=200;
if(servlet==null) {
code=404;
}
//调用servlet中的复地方法
try {
servlet.service(req, rep);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rep.pushToClient(code);
IOCloseUtil.closeAll(client);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stop() {
}
}
loginservlet类:
package Servlet;
import Server.Request;
import Server.Response;
public class LoginServlet extends Servlet {
@Override
public void doGet(Request req, Response rep) throws Exception {
//获取请求参数
String name=req.getParamter("username");
String pwd=req.getParamter("pwd");
if(this.login(name, pwd)) {
//调用响应中的构建内容的方法
rep.println("登录成功");
}else {
rep.println("登录失败,账号或密码错误");
}
}
private boolean login(String name,String pwd) {
if("bjsxt".equals(name)&&"123".equals(pwd)) {
return true;
}
return false;
}
@Override
public void doPost(Request req, Response rep) throws Exception {
// TODO Auto-generated method stub
}
}
servlet类:
package Servlet;
import Server.Request;
import Server.Response;
/**
*是所用请求的Servlet类的父类
*/
public abstract class Servlet {//处理请求与响应的方法
public void service(Request req,Response rep) throws Exception {
this.doGet(req,rep);
this.doPost(req,rep);
}
public abstract void doGet(Request req,Response rep) throws Exception;
public abstract void doPost(Request req,Response rep) throws Exception;
}