1.servlet编码解码
1.1.servlet要输出中文给客户端
response.setContentType("text/html;charset=utf-8");
1.2.告诉服务器使用指定的编码格式进行解码
request.setCharacterEncoding("utf-8");
1.3.获取响应输出写出流
PrintWriter out = response.getWriter();//输出文本
OutputStream response.getOutputStream();//输出字节(非文本)
例子:
OutputStream ops = response.getOutputStream();
2.获得表单中的请求参数值
String request.getParameter(String paraName);
String[] request.getParameterValues(String paraName);//多个参数名相同
Map request.gerParameterMap();//获取键值对形式的多个请求参数
例子:
String name = request.getParameter("name");
3.重定向
//生成重定向响应给浏览器
response.sendRedirect(String url);
例子:
response.sendRedirect("list.do");
4.分析请求资源路径,然后分别处理
String uri = request.getRequestURI();
例子:
String uri = request.getRequestURI();
// 截取字符串,只取"/名字"
String action = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
5.servlet初始化参数的处理
5.1.配置初始化参数
<servlet></servlet>中
<!-- 初始化参数 -->
<init-param>
<param-name>pricing</param-name>
<param-value>bj,0.08;sh,0.09;jn,0.03</param-value>
</init-param>
5.2.使用初始化参数
在init()中:
ServletConfig config = getServletConfig();
String pricing = config.getInitParameter("pricing");
6.告诉jdbc驱动,在输出时,使用utf-8这种编码格式进行编码
dbc:mysql://localhost:3306/数据库名?
useUnicode=true&characterEncoding=utf8
7.转发
7.1.转发
//先绑订数据
request.setAttribute(String name,Object obj);
//获得转发器//转发
request.getRequestDispatcher(String url).forward(request,response);
例子:
request.setAttribute("employee", employee);
request.getRequestDispatcher("emplist.jsp").forward(request, response);
例子2;
//(没有数据就不需要邦定数据)
request.getRequestDispatcher("error.jsp").forward(request, response);
7.2.接收转发
Object request.getAttribute(String name);
例子:
Employee e =(Employee)request.getAttribute("employee");
8.获取appName(应用名)
String request.getContextPath()
9.处理异常
方式一:邦定,转发
方式二:
throw new ServletException(e);
然后在web.xml中配置错误处理页面
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.jsp</location>
</error-page>
10.密码加密
MessageDigest md=MessageDigest.getInstance("md5");//或者sha算法
String s="字符串";
//生成摘要//是一个字节数组
byte[] buf =md.digest(s.getBytes());
//BASE64Encoding可以将任意的一个字节数组转换一个字符串
BASE64Encoder ec=new BASE64Encoder();
String str=ec.encode(buf);
11.异常的处理
步骤一.将异常抛出给容器
throw new ServletException(e)
步骤二.web.xml中配置错误处理页面
让容器知道出现异常后,应该调用哪一个页面。
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.jsp</location>
</error-page>
12.cookie技术
12.1.创建一个cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);//给浏览器添加cookie//通过响应头传递cookie
12.2.cookie的查询
Cookie[] request.getCookies();//获取请求信息中提交的cookie
if(cookie!=null){
String cookie.getName();
String cookie.getValue();
}
12.3.cookie的生存时间
cookie.setMaxAge(int seconds);
12.4.删除cookie
Cookie c = new Cookie("userId","");
c.setMaxAge(0);
response.addCookie(c);
12.5.cookie的编码问题只识别ASCII编码
// 编码
URLEncoder.encode("中文","utf-8")
// 解码
URLDecoder.decode(str,"utf-8");
12.6.设置cookie的路径
cookie.setPath(String path);
13.session技术
13.1.获得session对象
HttpSession session = request.getSession();
13.2.获得sessionId
String sessionId=session.getId();
13.3.邦定数据
session.setAttribute(String name,Object obj);
13.4.获取邦定数据
Object session.getAttribute(String name);
13.5.解除邦定
session.removeAttribute(String name);
13.6.设置session超时
session.setMaxInactiveInterval(int seconds);
13.7.删除session
session.invalidate();
14.验证码
14.1.jsp中的设置:
方式一:
<img src="checkcode" id="img1"
onclick="document.getElementById('img1')." +
"src='checkcode?' + Math.random();"/>
<a href="javascript:;"
onclick="document.getElementById('img1')." +
"src='checkcode?' + Math.random();">看不清,换一个</a>
方式二:
验证码:
<img id="num" src="checkCode" />
<a href="javascript:;"onclick="document." +
"getElementById('num').src = 'checkCode?'+(new Date()).getTime()">换一张</a>
15.url重写,用户禁止cookie,如何继续使用session
15.1.用于链接地址,表单提交地址,url重写
response.encodeURL(String url);
15.2.用于重定向,url重写
response.encodeRedirectURL(String url);
例子:
response.sendRedirect(response.encodeRedirectURL("list.jsp"));
15.3.转发不需要
16.过滤器
16.1.如何写一个过滤器
step1,写一个java类,实现Filter接口。
step2,将处理逻辑写在doFilter方法里面。
step3,配置过滤器(web.xml)
16.2.一般过滤器的request,response需要做强制转换。
HttpServletRequest request =(HttpServletRequest)arg0;
HttpServletResponse response =(HttpServletResponse)arg1;
16.3.调用后续的过滤器或者servlet
arg2.doFilter(arg0, arg1);
说明:
FilterChain:有一个方法doFilter(ServletRequest,ServletResponse),
如果调用了该方法,表示要调用后续的过滤器或者servlet。
如果没有调用该方法,则请求处理完毕,开始发送响应。
16.4.配置过滤器(web.xml)
web.xml中设置;
<!-- 过滤器的配置:要放在servlet前面 -->
<filter>
<filter-name>过滤器名</filter-name>
<filter-class>web.过滤器</filter-class>
<!-- 初始化参数 -->
<init-param>
<param-name>参数名</param-name>
<param-value>参数</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>过滤器名</filter-name>
<url-pattern>/过滤器之后要执行的servletURL</url-pattern>
</filter-mapping>
16.5.访问初始化参数
第一步:
private FilterConfig config;
第二步:
在init(FilterConfig arg0)中,将FilterConfig对象的引用保存下来
config = arg0;
第三步:
String FilterConfig.getInitParameter(String paraname);
例子:String str=config.getInitParameter(String paraname);
17.上传文件
jsp中的设置
<form action="fileupload" method="post" enctype="multipart/form-data">
name:<input name="name"/><br/>
photo:<input type="file" name="file1"/>
<br/>
<input type="submit" value="提交"/>
</form>
18.字符串编码解码
18.1.编码
String URLEncoder.encode("中文","utf-8")
18.2.解码
String URLDecoder.decode(str,"utf-8");
19.Servlet上下文
容器在启动的时候,会为每一个应用创建唯一的一个符合
ServletContext接口的实例
19.1.如何获得ServletContext?
a, GenericServlet.getServletContext();
b, HttpSession.getServletContext();
c, ServletConfig.getServletContext();
d, FilterConfig.getServletContext();
例子:
ServletContext sctx = getServletContext();
19.2.作用
a, 依据逻辑路径获得实际部署时的物理路径
String getRealPath(String path);
例子:
String path = sctx.getRealPath("upload");
b,绑订数据
setAttribute,getAttribute,removeAttribute
request,session,servlet上下文,都有这三个方法,
在满足需要的情况下,应该优先使用生命周期短的。
c, 访问全局的初始化参数
String getInitParameter(String paramName);
19.3.全局的初始化参数配置
<!-- 全局的初始化参数 -->
<context-param>
<param-name>company</param-name>
<param-value>tarena</param-value>
</context-param>
20.监听器
20.1.如何去写一个监听器?
step1, 先写一个java类,实现相应的监听器接口。
要依据监听的事件类型来选择相应的监听器接口(
比如,要监听session的创建和销毁,要用
HttpSessionListener接口)。
step2,在接口所声明的方法里面,实现相应的处理逻辑。
step3,注册监听器(web.xml)。
20.2.注册监听器web.xml的配置
<!-- 监听器的配置 -->
<listener>
<listener-class>web.监听器类名</listener-class>
</listener>
21.web.xml的配置顺序
<!-- 全局的初始化参数 -->
<!-- 过滤器的配置 -->
<!-- 监听器的配置 -->
<!-- servlet的配置 -->
<!-- 首页 -->
/////////
22.servlet的线程安全问题
22.1.servlet在容器内部只有一个实例,容器会启动多个线程来调用这个servlet实例,
就有可能发生线程安全问题:
比如,多个线程同时去修改servlet实例的某个属性。
22.2.如何解决?
a,使用synchronized关键字加锁
例子:
synchronized(this){
count ++;
}
b,让servlet实现SingleThreadModel接口(不建议使用)
容器会为每一个线程创建一个对应的servlet实例来处理请求。
因为会产生过多的servlet实例,所以,建议少用。
23.mvc
23.1.可以用自定义异常来处理model模型中的检索的信息
用自定义异常抛出信息 ,可以用异常编号进行异常区分
--------------------------------
if(a == null){
//抛出一个自定义异常
throw new AccountNotExistException();
//用编号,在自定义异常类的构造器中实现初始化的参数
//throw new AccountNotExistException(1001);
}
--------------------------------
catch (Exception e) {
e.printStackTrace();
if(e instanceof AccountNotExistException){
request.setAttribute("apply_error", "帐号不存在,请重新输入");
request.getRequestDispatcher("apply.jsp")
.forward(request, response);
}
}
--------------------------------
23.2.mvc
m:model:业务逻辑是java类
v:view:视图,例如jsp
c:controller:控制器,servlet