javaweb开发之servlet

1、servlet提交数据的方式     

    用get方式提交数据不能超过255个,但提交速度高于post,提交内容会在地址栏中显示出来。post方式提交数据要提供数据的类型和长度,数据类型有两种:一种是普通文本数据;另一种为文件数据(二进制数据)。Post常用来提交表单数据,提交用户资料或上传文件等。

2、servlet的工作流程

      浏览器提交遵循HTTP协议的文本,这段文本有服务器(tomcat)接收并解析,封装成了HttpServletRequest类型的request对象。

      服务器同时把输出流封装为HttpServletResponse类型的response对象,通过设置response的属性就可以控制输出的内容。然后服务器把request和response作为参数,调用Servlet相应方法。

3、web工程的目录结构

      Web程序部署在Tomcat的/webapps下面,每个web应用称为Context,路径/project称为上下文路径ContextPath.,单个文件也可以放在webapps/ROOT下面访问执行。

      WEB-INF文件夹下的内容是任何人都不能访问的,所以我们可以将一些机密文件放到该文件夹下。

4、web.xml文件配置

      "/ "只有一个斜杠的配置为缺省的servlet,它处理所有servlet不处理的请求。

      在<servlet>标签中可以配置servlet名称、servlet类名,还可以为servlet配置多个初始化参数及参数值servlet中可以使用方法getServletConfig().getInitParameter(String paramName)来获取配置的初始化参数值。还可以配置servlet启动的优先级,可选值为0和1,当设置为1时则tomcat会在启动时加载该servlet,否则在该servlet第一次被访问时加载。

 <servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>org.jyjd.FirstServlet</servlet-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

       除了配置servlet还需要配置servlet的访问方式,其中<servlet-name>中的名字要与<servlet>中配置的名字相同,<url-pattern>中配置的是该servlet的访问方式。<url-pattern>中允许使用通配符”*”或”?”,*表示任意长度的字符串,?表示任意字符,Struts、JSF框架上就使用了通配符,把XXX.do、XXX.jspa等格式的所有url都映射到某核心的servlet上。

<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/FirstServlet</url-pattern>
  </servlet-mapping>

       在javaEE5之后<servlet-mapping>中可以配置多个<url-pattern>如下配置之后就可以通过/FirstServlet.php来访问该servlet,起到了隐藏编程语言的效果。

 <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/FirstServlet</url-pattern>
    <url-pattern>/FirstServlet.php</url-pattern>
  </servlet-mapping>

5、获得上下文参数

        <init-param>配置在<servlet>标签里面只能有这个servlet读取,他不是全局参数不能由其他servlet读取。

       <context-param>配置的参数文上下文参数(文档参数)可以让所有的servlet访问获取参数的方法时通过getServletContext()方法获得一个ServletContext对象然后调用该对象的方法getInitParameter(String pname)获得全局全局参数的值。

       注意:ServletContext对象的getInitParameter(String pname)方法获得的全局参数。

      Servlet对象的getInitParameter(String pname)获得该servlet的参数(该方法继承于ServletConfig)。

6、资源注射或资源注入

      在web.xml中配置初始化参数

<env-entry>
	<env-entry-name>hello</env-entry-name>
	<env-entry-type>java.lang.String</env-entry-type>
	<env-entry-value>hello world I love java</env-entry-value>
	</env-entry>
      在servlet中声明过后就可以直接使用

@Resource(name="hello") 
	private String hello;

      需要注意的是资源注射时只可以注射java.lang包下的数据类型。

      资源注射的工作原理JNDI,如果不使用@Resource将制定名称的JNDI资源注射到servlet中我们同样可以获取到该资源,获取方法如下:

try {
	Context ctx=new InitialContext(); //实例化一个Context对象
	String hello=(String) ctx.lookup("hello"); //查找资源hello
} catch (Exception e) {
			// TODO: handle exception
}

      注射数据源:Servlet中不仅可以注射String、Integer等数据类型,还可以注射自定义的javabean、数据源等复杂类型变量,如下只要配置好数据源就可以在servlet中注射:

@Resource(name="DataSourse")  //声明数据源名称,数据源配置在Tomcat中
	 javax.sql.DataSource DataSourse;   //注射到DataSourse属性上
	 
	 public Connection getConn(){ //方法中直接使用DataSourse
		 Connection cnn= DataSourse.getConnection();
		 return cnn;
	 }
7、servlet传值、浏览器定时刷新、servlet成员变量

      在servlet中使用request.setAttribute()方法把值放到request中,然后在跳转到的jsp页面用request.getAttribute()方法把值从request中取出。

       控制浏览器每个一秒刷新一次,response.setHeader("Refresh","1000;URL=http://www.jiafeng.com/firstWeb/IdentityServlet");

       servlet不是线程安全的,尽量不要把servlet的属性定义为类属性,应把变量定义在doGetdoPost方法中,如果是只读属性可以定义为类属性,最好定义为final型。

   servlet在用forward形式跳转时跳转之前不能有输出到达客户端,不能用out.println()语句。

8、servlet生命周期

   浏览器首先发送HTTP请求到web容器

   web容器到对象池里面寻找请求的servlet实例(如果没有说明是第一次访问该servlet创建servlet实例)。

   web容器创建request(请求对象)和response(响应对象)

   调用servlet实例的service方法,service方法读取request中的信息并向response中写入响应信息。

   servlet将service写入的response返回给服务器,服务器从response中读取响应信息

   服务器构建HTTP响应发送给浏览器。

   服务器停止时销毁servlet实例

9、servlet中的对象

   ServletConfig对象,当servlet配置了初始化参数后在服务器创建servlet对象时会自动将这些参数封装到ServletConfig对象中并在调用servletinit时将ServletConfig对象传递给servlet。初始化参数中可以配置字符码表、数据库连接信息等。

   ServletContext对象,web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通信,ServletContext对象通常被称为Context域对象。(在jsp中称为application)

10、加载资源文件

    ServletContext读取资源文件,通常开发中我们一般使用两种资源文件properties文件和xml文件。如果数据之间有关系时就用xml文件,如果数据之间没有关系就用properties文件(如连接数据库的信息)

    这里注意我们在src下建的文件系统会部署到/WEB-INF/classes文件夹下所以写路径时要注意。如果在包中就把包转换为文件夹加上包对应的路径。如果在/WebRoot中就不需加文件夹直接写件/db.properties对于web项目来说相对路径是从/WebRoot下面开始找的,可以用ServletContext的getRealPath(Stringpath)方法获得文件的绝对路径。

  InputStream is=this.getServletContext().getResourceAsStream(
               "/WEB-INF/classes/db.properties");
		Properties p=new Properties();
		p.load(is);
		       is.close();

   在java中我们要加载资源文件时会使用该资源文件的类的加载器去加载(并且使用静态代码块包起来)如下:

//使用加载该类的类加载器加载指定文件为输入流
	   InputStream is=KuangJia.class.getClassLoader().getResourceAsStream
       ("cn/itcust/day2/config.properties");
		//或者
       InputStream is=KuangJia.class.getResourceAsStream(
           "config.properties");//(实际上同上)
		Properties ps=new Properties();
		ps.load(is);//将该输入流加载到properties集合中
		is.close();
11、response发送响应到浏览器

    response用getOutputStream()输出数据和中文时要注意,程序以什么码表发送数据,就要控制浏览器用什么码表显示。浏览器默认使用的是gb2312码表response.setHeader("Contenttype","text/html;charset=UTF-8");通过设置响应头,设置浏览器用什么码表显示。

  PrintWriter out=response.getWriter();//使用的是ISO-8859码表
   //使用该对象输出是要设置response的码表
   response.setCharacterEncoding("UTF-8");
   //当response使用UTF-8码表输出时,要设置浏览器的显示码表
   response.setHeader("Content-type","text/html;charset=UTF-8");
   或response.setContentType("text/html;charset=UTF-8");
12、中文乱码

    req.setCharacterEncoding("utf-8");//用post方式提交中文数据时设置request的码表

    如果用get方式提交中文数据乱码时上面的设置将不起作用,这时就要将获得的数据用ISO8859-1转换成字节数组再用字节数组构造字符串

    byte[] b=username.getBytes("ISO8859-1");

     username=new String(b,"UTF-8");

     或是修改tomcat中配置文件中的编码URIEncoding="UTF-8";

13、读取资源

    如果在普通的类中读取资源时可以用文件流读取,也可以用类装载器读取(有键值对的资源文件)。如果在web应用的servlet中读取时可以使用ServletContext读取可以获得文件的流也可以获取文件的路径。this.getServletContext().getRealPath("/");web应用的根目录。OutputStream out = response.getOutputStream();通过输出流写给浏览器

14、生成随机验证图片

// 设置图片的宽和高
public static final int WIDTH = 120;
public static final int HEIGHT = 25;
// 设置字符字典
public static char[] CHARS = { '2', '3', '4', '5', '6', '7', '8', '9',   
     'A','B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P',
     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
public static Random random = new Random();
	public static StringBuilder builder;
        //然后生成一个图片得到图片的画笔
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
				BufferedImage.TYPE_INT_RGB);
	    Graphics2D g = image.createGraphics();
     // 1.设置背景颜色
    g.setColor(Color.GRAY);
g.fillRect(0, 0, WIDTH, HEIGHT);// 使用特定颜色填充矩形区域
// 2.设置边框
    g.setColor(Color.RED);
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);// 特定颜色显示矩形边框
// 3.画干扰线
    g.setColor(Color.CYAN);
    for (int i = 0; i < 5; i++) {
    // 随机生成起始坐标和结束坐标
    int x1 = random.nextInt(WIDTH);
    int y1 = random.nextInt(HEIGHT);
    int x2 = random.nextInt(WIDTH);
    int y2 = random.nextInt(HEIGHT);
    g.drawLine(x1, y1, x2, y2);
    }
	    // 4.画随机字符
     builder = new StringBuilder();
     g.setColor(Color.ORANGE);//设置字体颜色
     g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));//设置字体样式大小
     int x = 15;
     for (int i = 0; i < 5; i++) {
              char c = CHARS[random.nextInt(CHARS.length)];
		builder.append(c);
		int degree=random.nextInt()%30;//生成-30到30之间的随机数
		g.rotate(degree*Math.PI/180, x, 20);//以(0,20)旋转-30到30度
		g.drawString(c + "", x, 20);
		g.rotate(-degree*Math.PI/180, x, 20);//写完字后重新旋转回来
		x += 20;
	}
	     System.out.println(builder);
     // 5.图形写给浏览器
response.setContentType("image/jpeg");// 通知浏览器response传过来的是一个图片
response.setDateHeader("expries",-1 );//设置浏览器不要缓存该图片保证每次都得到一个新的图片
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
	ImageIO.write(image, "jpg", response.getOutputStream());











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值