public class AHttpServlet extends HttpServlet{
/**
* Http servlet首先就是继承的是GenericServlet,它里面有更丰富的方法,但是说到底还是要运行service方法,但是这个类里面的service方法其实有两个
* 第一个是从上面继承下来的,另一个是自己的实际要用的,他们的不同就在于参数,自己的那个参数是与Http协议相关的,也就是说这个东西绑定了Http协议
* 但是以前的那个参数是与协议无关的,但是最终tomcat要调用的是父类里面的service方法,所以说在继承的service方法中首先把参数都强转成http类型的参数
* 也就是自己的service方法的参数,然后去调用自己的service方法,自己的service方法里面会判断来自客户端的请求究竟是post还是get然后调用doPost或者doget
* 方法,所以说最终我们只需要复写doGet或者doPost即可
* HttpServlet这个类是抽象的,但是里面的方法没有一个是抽象的,doGet和doPost默认都是给客户端返回一个405也就是不支持的请求类型,所以如果不复写
* 这两个方法就会出问题405
*
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
}
仿写的 GenericServelt 的代码
public class SrcGenericServlet implements Servlet{
private ServletConfig servletConfig; //很重要的一个对象,里面有五个方法,前面已经说了两个方法就是关于初始化配置的两个
//还有就是Context,以及getServletName()获取Servlet的名字
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
//这个就是钩子,如果我们写好的这个类然后有别人去继承,那么如果他想在init方法里面添加一些自己的功能
//这个init有参数的如果被覆盖的话,子类中的servletConfig就会指向空指针,因为没有初始化。
//所以为了拓展,子类能够写自己的代码我们写了一个新的函数,子类只需要覆盖这个函数就可以到到目的
//不过还有一个方式就是在子类中我们先写自己的代码,然后使用super.init()也是能够搞定的
init();
}
public void init(){
}
public ServletContext getServletContext(){
return this.servletConfig.getServletContext();
}
@Override
public ServletConfig getServletConfig() {
return this.servletConfig;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return "hello";
}
@Override
public void destroy() {
}
}
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>Servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
或者直接在 Servlet 的类上面写 @WebServlet( name=””, url-pattern=”” ) 而不用写 web.xml 的配置
Class clazz=Class.forName("cn.lwen.Person");
Person p=(Person) clazz.newInstance(); //p就是person的实例,这个显然也就是无参数的构造方法来实现的然后对于有参数的构造方法则是使用getConstructor来获取这个实例
Class clazz=Class.forName("cn.lwen.Person");
Constructor cs=clazz.getConstructor(类型的class(如:String.class)由于这个地方是可变参数,所以说参数的个说可以有多个)
Person p=new (Person) cs.newInstance("lwen");
1. 首先就有一个发送状态信息的方法:response.sendError(404,"访问的页面存在但是不给你看");//发送一个错误的返回信息
2. 然后就是设置头信息,头信息就是键值对这里有三个常用的设置头信息的方法:
setHeader("","")
setIntHeader("",int)
setDateHeader("",second)
然后这个方法把set改成add就是一个键多个值
设置重定向setRedirect("URL") 快捷的方法 也可使用设置头来做
3. response里面的两个流,字符流和字节流,但是这两个流 不能同时存在否则会抛异常
getOutputStream()
getWriter()
1. 获取客户端的信息,获取客户端的url信息
2. 获取客户端的请求的参数,无论是get还是post对于单值的属性都可以使用getParameter("name") 然后对于多值则是getParameterValues()返回数组
getParameterNames()获取所有的键名,是枚举类型
3. 请求转发和请求包含。
请求转发:如果我们访问A,然后A做了请求转发到B,那么最终返回给客户端的就是保留了A的请求头和B的请求体(留头不留体)这次过程中url不变
请求包含:同上,只是这次包含A的头和体还有B的体
他们与重定向是不同的,浏览器不知道A请求了B,这始终就是一个请求
request.getRequestDispatcher("/AServlet").forward(request,response); //请求转发
request.getRequestDispatcher("/AServlet").include(request,response); //请求包含
//request域 在Servlet中有三大域对象,在javaweb中有四个
//分别就是request,session,application,Context
//他们的生命周期就和这个对象的生命周期相同
//他们都用相同的方法setAttribute() getAttribute() removeAttribute() 然后供其他的Servlet使用这些存在这些对象的信息
编码分为响应编码和请求编码
响应编码:就是服务器向客户端发送的数据的编码,我们首先要自己发送的是utf-8并且还要浏览器用utf-8去解析,我们采用的就是http头信息
setHeader("Content-Type:text/html;charset:utf-8") 或者直接一个简单的方法就是setContentType("text/html;charset:utf-8")
请求编码:则是服务器接受客户端过来的请求,进行编码,客户端默认使用的是iso,我们需要转成utf-8,而且这个地方是区分post和get请求方式的
post就直接使用setCharacterEncoding("utf-8")而get就需要先转化成byte数组然后使用string转成utf-8
byte[] by str.getBytes("ISO-8859-1");
string =new String(byte,"utf-8")
一个jsp页面可以使用多个指令,不一定放在第一行
pageEncoding 设置页面的编码 在服务器把jsp编译成java时使用这个属性
contentType 设置返回响应头 就和setContentType()方法一样
以上两个属性只要设置了一个属性另一个属性可以不设置
如果都不设置就是iso8859-1
import 导包 可以用逗号隔开
errorPage 当前页面如果抛出异常要转发到哪个页面,不是跳转 状态码200
isErrorPage 设置当前页面是否为处理错误的页面 只有这个页面可以使使用9大内置对象的exception(当标签的内容为true) 状态码为500
isELignore 是否忽略el表达式
他是在编译成java文件的时候完成的 他们共同编译成一个java文件 然后生成一个class
他和ResponseDispatcher的include作用类似 只是他是动态包含 编译成两个不一样的文件class 最后运行的时候才合并 动态合并
静态包含的作用就是页面分解
引入标签库
prefix引入前缀
uri 标签的地址
<%@ page …..%> 在web.xml中配置errorPage
<error-page>
<error-code>404</error-code>
<localtion>/error.jsp</localtion>
</error-page>
<error-page>
<error-code>500</error-code>
<localtion>/error.jsp</localtion>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type> //页面抛出任何异常都会显示500 有事为了更加细致的分 我们可以定异常来处理
<localtion>/error.jsp</localtion>
</error-page>
Servlet三大jsp四大域对象
他和RequestDispatcher中的forward一样 就是一个在Servlet中使用一个在jsp中使用
同上 include方法一样
用来作为前两个的子标签 用来给包含的或者转发的页面传递参数
必须要为成员提供get和set方法 必须要有默认构造器 某个属性有get和set方法但是没有该属性 也是可以的 boolean的属性get方法可以直接就是is。。
$(pageScope.xxx) 获取并输入该域中的xxx字段 $(requestScope.xxx) $(sessionScope.xxx) $(applicationScope.xxx) 如果不写那么就是全域查找
EL表达式就是用来输出的 用来代替<%= %>
其中只有pageContext不是map类型 因为她就是pageContext类型其他的都是map类型 在El表达式中 Map的值访问可以使用点 或者数组方式 map[‘key’] map.key 上面已经有4个就是pageScope…. 然后就是 param key为参数名value为参数值 和getParam方法一样 适用于单值的 paramValues 适用于多值的 和上面的一样 value是一个数组 header: headerValues: 这两个同上 initParam 获取里面的参数 cookie value是cookie对象 所以在获得cookie对象以后必须要使用value才能获得值 pageContext 例如${pageContext.request.contextPage} 获取request域中的contextPage内容
首先需要导入JSTL的函数库 ${fn:substring(“123123”,1,2)}
写一个java类 类中的方法可多个 但是必须为 public static 然后写tld文件,ide可以生成在xml下
jsp:
三大指令
include page taglib
九个内置对象
response cookie out page pageContext request Exception config application
动作标签
forward include param
javaBean:
默认构造器
set,get方法
EL表达式:
基本语法
11个内置对象pageScope...Header,headerValuers,initParam,cookie,pageContext,param,paramValues
函数库
四大标签库:core核心库(重要),fmt(格式化),sql,xml(后两个过时)
导入标签,使用taglib指令
1. 步骤: * 标签处理类 实现SimpleTag接口 或者继承simpleTagSupport他做了很多处理 tomcat传 给simpleTag的参数都被保存了 * tld文件(xml)标签和类相关联 都放在WEB-INF中 防止别人直接访问 * 在页面中引入 2. 标签处理类 * 这些方法都是有tomcat调用 最后调用的是doTag方法 和Servlet非常类似 * doTag 执行标签的时候调用 * getParent 获得父标签 * setParent 设置父标签 * setJspBody 设置标签体 * setJSPContext 设置pageContext 3. 跳过某部分 直接在处理类中抛出一个跳过页面异常,最终编译的代码就是一个标签一个函数,由于这个函数也是直接抛出异常,所以该标签后面的内容就不执行了 而是跑到调用该函数的try块中的catch中执行响应的方法,这个catch对SkipPageException特别的照顾了一下,然后就结束了 4. 自定义标签属性: 1. 在处理类中创建属性 2. 在tld文件中定义
mvc是bs架构的公共的东西 而三层架构则是java web的东西: web层 与web相关的 Servlet jsp 业务层 功能【登陆,注册,转账 等等…】(service) 数据层(dao 【data access Object】)(dao)