java语言编写动态资源的开发技术,普通的java类
转发与重定向的区别
- 转发
Forward
在服务器端完成的;重定向redirection
是在客户端完成的 - 转发的是同一次请求;重定向是两次不同请求
- 重定向不能保存数据在request域中,转发可以
- 转发地址栏没有变化;重定向地址栏有变化
- 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
加载资源文件路径
"."代表tomcat/bin目录,不能再web项目中使用
Servlet线程
- 单例多线程
tomcat实例化一个servlet类,为每个用户开启一个线程处理请求 - 线程安全问题
多个用户访问Servlet的共享数据(成员变量),可能会产生线程安全问题
解决:使用共享数据时加锁 - 实现单线程模式
<%@ page isThreadSafe=”false”%> 默认值为true
https://blog.csdn.net/john2522/article/details/7467983
Servlet开发步骤
- 编写Servlet类
继承HttpServlet类,重写doGet() doPost()方法 - 编译servlet字节码
存放在tomcat的一个web应用中的WEB-INF/classes目录下 - 配置一个servlet web.xml中
<servlet>
<!-- servlet的内部名称 ,可以自定义-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet类名: 包名+简单类名-->
<servlet-class>gz.itcast.d_servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的内部名称,和上面的名称保持一致!!!-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的访问名称: /名称 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 访问
启动tomcat,访问http://localhost:8080/myweb/hello
servlet生命周期
- 加载Servlet
当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例【构造器】 - 初始化
当Servlet被实例化后,Tomcat会调用【init()】方法初始化这个对象 - 处理服务
当浏览器访问Servlet的时候,Servlet 会调用【service()】方法处理请求 - 销毁
当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用【destroy()】方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
简单总结
只要访问Servlet,service()就会被调用。
init()只有第一次访问Servlet的时候才会被调用。
destroy()只有在Tomcat关闭的时候才会被调用。
servlet的自动加载
默认是第一次访问时加载,改变servlet的加载时机可以提前到加载web应用时创建
配置servlet时添加<load-on-startup>1</load-on-startup>
,tomcat启动时会加载此类,越小优先级越高
HttpServletRequest
请求行
request.getMethod(); 请求方式
request.getRequetURI() / request.getRequetURL() 请求资源
request.getProtocol() 请求http协议版本
请求头
request.getHeader("名称") 根据请求头获取请求值
request.getHeaderNames() 获取所有的请求头名称
**实体内容**
```java
request.getInputStream() 获取实体内容数据
获取请求参数
request.getParamerter(参数名): 获取一个值的参数
request.getParamerterValue(参数名):获取多个值的同名参数,如select元素值
request.getParamerterNames(): 获取所有参数名称列表
设置请求参数的编码格式
request.setCharacterEncoding("utf-8"); //只对POST方式提交的数据有效
HttpServletResponse
响应行
response.setStatus(404) 设置状态码
响应头
response.setHeader("name","value") 设置响应头
实体内容
response.getWriter().writer(); 响应二进制数据
response.getOutputStream().writer() 响应字符数据
设置响应类型和内容编码 如果未指定字符集,则将使用ISO-8859-1
response.setContentType("text/html;charset=UTF-8")
以流的方式响应
response.setContentType("text/html; charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.close();
重定向
response.sendRedirect("www.baidu.com");
转发
request.getRequestDispatcher("/student_list").forward(request, response);
ServletConfig对象
初始化参数配置
<servlet>
<servlet-name/>
<servlet-class/>
<init-param>
<param-name>name</param-name>
<param-value>xyg</param-value>
</init-param>
</servlet>
创建
tomcat启动web应用封装这些配置信息到servletconfig对象中,调用init()时传入servletconfig对象
获取
this.getServletConfig().getInitParameter("name");//获取配置信息
ServletContext对象
servlet的上下文对象,表示当前web应用环境,
一个web应用中只有一个servletContext对象
获取
this.getServletConfig().getServletContext();//通过配置对象获取上下文对象
方法
servletContext.getContextPath(); //获取部署的项目名
servletContext.getInitParameter("name"); //获取web应用初始化参数(全局)
servletContext.getRequestDispatcher("/get").forward(request,response); //转发
Session & Cookie
Session
session的主要信息存在于服务器,在客户端只存放一个sessionid(基于cookie的),每次请求,客户端都会自动把sessionid发送到服务端去,服务端根据sessionid去session里获取信息
session获取和删除
Person person =(Person)session.getAttribute("person"); // 获取登录的person
session.removeAttribute("person"); // 移出登录的person
Cookie
Cookie保存于客户端
添加Cookie值
public static void addCookie(HttpServletResponse response, String name,
String value, int maxAge) {
try {
Cookie cookie = new Cookie(name, value);
if (maxAge > 0)
cookie.setMaxAge(maxAge);
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception ex) {
ex.printStackTrace();
}
}
获取Cookie值
public static String findCookieByName(HttpServletRequest request,
String name) {
Cookie[] cookies = request.getCookies();
if (null == cookies || cookies.length == 0) return null;
String string = null;
try {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
String cname = cookie.getName();
if (!StringUtils.isBlank(cname) && cname.equals(name)) {
string = cookie.getValue();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return string;
}
晴空指定Cookie
public static boolean clearCookie(HttpServletRequest request,
HttpServletResponse response, String name, String domain) {
boolean bool = false;
Cookie[] cookies = request.getCookies();
if (null == cookies || cookies.length == 0) return bool;
try {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = new Cookie(name, null);
cookie.setMaxAge(0);
cookie.setPath("/");// 根据你创建cookie的路径进行填写
cookie.setDomain(domain);
response.addCookie(cookie);
bool = true;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return bool;
}