Servlet是sun公司提供的一门用于开发动态web资源的技术,咱们也把实现了servlet接口的java程序,称之为Servletphp
一、编写一个Java类,实现servlet接口。html
package Servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 这也是一个页面,一个特殊的页面 * 彻底使用Java编写的页面,甚至能够认为这是一个虚拟页面 * Request:来自浏览器的请求(输入流) * Response:服务器给浏览器的响应(输出流) * @author Don * @date:日期:2017年4月1日 时间:下午3:30:11* * @version 1.0 */ public class ServletTest extends HttpServlet { /** * doGet方式主要来源url的跳转 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("GET通道"); /** * 当多线程并发访问这个方法里面的代码时,会存在线程安全问题吗 * i变量被多个线程并发访问,可是没有线程安全问题,由于i是doGet方法里面的局部变量, * 当有多个线程并发访问doGet方法时,每个线程里面都有本身的i变量, * 各个线程操做的都是本身的i变量,因此不存在线程安全问题 * 多线程并发访问某一个方法的时候,若是在方法内部定义了一些资源(变量,集合等) * 那么每个线程都有这些东西,因此就不存在线程安全问题了 */ int i=1; //若定义为全局变量则线程不安全 i++; //若程序所需必须为全局变量的时,定义全局变量后,用以下方式 synchronized (this) {//在java中,每个对象都有一把锁,这里的this指的就是Servlet对象 i++; try { Thread.sleep(1000*4); } catch (InterruptedException e) { e.printStackTrace(); } resp.getWriter().write(i+""); } //解决get乱码的问题 String str= req.getParameter("Name"); byte[] bs = str.getBytes("ISO-8859-1"); String name = new String(bs, "UTF-8"); //告诉浏览器这是个什么响应(解决浏览器展示为练吗) resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.print("<html>"); out.print("<head>"); out.print("<title>个人Servlet测试</title>"); out.print("</head>"); out.print("<body>这是我得第一个Java Servlet程序...</body>"); out.print("</html>"); } /** * doPost方式主要用来提交表单 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("POS通道"); //POST解决乱码 resp.setCharacterEncoding("UTF-8"); } }
二、把开发好的Java类经过Web.xml部署到web服务器中。java
在web.xml中配置url访问的Servlet,配置在<web-app></web-app>中web
<servlet> <servlet-name>Servelet</servlet-name> <servlet-class>Servlet.ServletTest</servlet-class> </servlet> <!-- 一个Servlet可映射多个URL地址 --> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>/hello/good.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>/hello/good.php</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>/hello/good.aspx</url-pattern> </servlet-mapping> <!-- 通用匹配符 *和/ /*--> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>/action/*</url-pattern> </servlet-mapping> <!-- 缺省Servlet用于处理全部其余Servlet都不处理的访问请求 --> <servlet-mapping> <servlet-name>Servelet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
Servlet下实现的功能简介数组
request 表明浏览器发往Java的请求,包含输入流 response表明Java发往浏览器的响应,包含输出流 request.getParameter 接一个参数 request.getParameterValues 接数组 GET传汉字容易出现乱码 POST传汉字只须要设置req.setCharacterEncoding("UTF-8")便可 URL自己有字符集,火狐默认ISO-8859-1 //火狐GET方式传汉字到Servlet String str=req.getParameter("un"); byte[] bs = str.getBytes("ISO-8859-1"); String name = new String(bs, "UTF-8"); System.out.println(name); 重定向: //获取上下文路径,也就是所谓的项目根,至关于WebRoot String path = request.getContextPath(); //重定向:给浏览器一个新方向,去吧,重定向以后最好return response.sendRedirect(path+"/index.jsp"); return; 请求转发: //请求转发到B,属于服务器内部转发,浏览器是看不到的 //转发器,路径中的/表明了WebRoot RequestDispatcher dis = request.getRequestDispatcher("/servlet/b"); dis.forward(request, response); //转发 request的生命周期很短,当咱们看到页面时它就已经死掉了。 request.setAttribute(name,object);能够临时存储数据