CS/BS;Servlet接收表单数据;乱码问题;Servlet运行原理;Servlet路径相关;上下文和预置数据;重定向和转发;
------------------------------------------------------------------------------------------------------------------------
两层CS(Client Server):客户端+DB
特点: - 数据库作为Server,使用数据库特定的编程语言编写业务。 - 客户端提供操作界面和少量的业务逻辑处理。 缺点: - 移植性差(更换数据库需要重新编程) - 不适合大写应用(客户端需要与数据库之间建立持续的链接)三层CS:客户端+应用服务器+DB
特点: - 数据库只负责管理数据。 - 应用服务器提供所有的业务逻辑的处理。 - 客户端只负责提供操作界面。 优点:移植性好,只适合大型应用。 缺点: - 客户端需要单独安装,开发复杂(需要自定义协议,编写客户端和服务端的通信模块)BS:Browser+Web Server + DB
特点: - 数据库只负责数据的管理。 - Web服务器负责业务逻辑的处理。 - 浏览器负责提供操作界面。 优点: - 不需要单独安装客户端。 - 开发比CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信。Servlet:扩展Web服务器功能的组建规范。
Servlet容器:即TomCat。
------------------------------------------------------------------------------------------- Servlet获取请求参数:(接收表单传入的数据) - 通过request获取请求数据,如果参数名不存在则返回null - getParameter(name) -> String - getParameterValues(name) -> String[] 例 String code = req.getParameter("code"); String[] interests = req.getParameterValues("interest");请求方式:浏览器向服务器传递数据的方式。 - req.getMethod();
get:采用路径传承,参数可见。隐私性差。数据大小守路径限制(2k)。 post:采用实体内容传参,参数不可见。数据大小不受限。 - 向服务器索取(查询)数据时通常用get,向服务器提交(保存)数据时通常用post。乱码问题:
其中方案一的代码如下:
String code = req.getParameter("code"); code = new String(code.getBytes("iso8859-1"),"utf-8");Servlet输出中文:在获取WriteOut对象及调用out方法之前调用setContentType方法。
- res.setContentType("text/html;charset=utf-8");Servlet运行原理:
Servlet生命周期:
改为在TomCat启动时创建并初始化Servlet的方法:
<servlet> <servlet-name>demo</servlet-name> <servlet-class>web.DemoServlet</servlet-class> <!-- 参数1表示服务器启动时第一个加载此Servlet --> <load-on-startup>1</load-on-startup> </servlet>Servlet访问路径的方案:
1.精确匹配:<url-pattern>/abc</url-pattern> 2.通配符匹配:<url-pattern>/*</url-pattern> 3.后缀匹配:<url-pattern>*.abc</url-pattern> - 优先级最高的是精确匹配,都没匹配成功则容器会查找相应的文件,找到返回文件,否则返回404。//项目名
System.out.println(req.getContextPath()); //Servlet网名 System.out.println(req.getServletPath()); //uri:Servlet绝对路径 System.out.println(req.getRequestURI()); //url:Servlet完整路径 System.out.println(req.getRequestURL()); URI和URL的区别:路径:
- 连接地址:<a href="url"></a>
- 引入图片:<img src="url"/> - 引入子jsp: <c:import url=""><c:import> - 表单提交:<form action="url"> - 重定向: res.sendRedirect(url); - 转发: req.getRequestDispatcher(url); 插入图片 路径的处理技巧: 1.使用绝对路径时: - 链接地址、表单提交、重定向是从应用名开始写,转发是从应用明之后开始写.2.获取应用的实际部署名称(项目名称): String req.getContextPath(); 如:"/netctoss"
3.获取请求路径: req.ServletPath(); 如:"/findCost.do"等--------------------------------------------------------------------------------------------------------------------------
预制数据:ServletConfig和ServletContext
ServletConfig:给某一个Servlet预置数据。 ServletContext:给所有的Servlet预置数据在web.xml中预制数据:
<!-- 预制一个数据 --> <init-param> <param-name>maxOnline</param-name> <param-value>2000</param-value> </init-param><!-- 预制一份共有的数据 -->
<context-param> <param-name>size</param-name> <param-value>10</param-value> </context-param> 读取预制的私有数据: ServletConfig cfg = getServletConfig(); String maxOnline = cfg.getInitParameter("maxOnline");获取预制的共有数据:
ServletContext ctx = getServletContext(); String size = ctx.getInitParameter("size"); Servlet上下文:容器启动后,会为每个web应用创建一个唯一的一个符合ServletContext接口的对象, 该对象就是servlet上下文。 获取上下文的方式:(有多种)如:通过ServletConfig提供的getServletContext方法获取。作用:
- 使用setAttribute绑定数据 - 使用removeAttribute移除绑定数据 - 使用getAttribute获取绑定数据 特点:servlet上下文绑定的数据可以被整个应用上的所有组件共享,且可以一直访问。 例:绑定数据count(流量) ServletContext ctx= getServletContext(); ctx.setAttribute("count", 0); Object count = ctx.getAttribute("count"); int c = Integer.parseInt(count.toString())+1; ctx.setAttribute("count", c);----------------------------------------------------------------------------------------------------------------------------
重定向和转发:
一.重定向:response.sendRedirect(String url)二.转发:
1.绑定数据到request对象: - 实现绑定:request.setAttribute(String name,Object obj) - 读取绑定值:Object request.getAttribute(String name) 2.获得转发器: - RequestDispatcher rd = request.getRequestDispatcher(String url)3.转发:
- rd.forward(request,response) 通常第二步和第三步合并为一行语句:request.getRequestDispather(url) 例 req.setAttribute("cost", cost); req.getRequestDispatcher("WEB-INF/cost/update.jsp").forward(req,res);重定向与转发的区别:
转发原理:
----------------------------------------------------------------------------------------------------------------------
补充:Bean属性 class Student {//对象属性
private String name;//Bean属性:studentName
public String getStudentName() { return this.name; }public void setStudentName(String name) {
this.name = name; }}