Javaweb之servlet(一)

servlet的用法

1.新建一个类,实现Servlet接口,叫MyServlet

2.实现Servelet的五个方法,在service中做操作

3.配置servlet,<servlet>内部有<servlet-name>、<servlet-class>Servlet-name就是我们给servlet起一个名字Servlet-class写出MyServlet的全限定名

5、配置servlet-mapping,<servlet-mapping>内部有<servlet-name>、<url-pattern>Servlet-name要和之前的servlet中的servlet-name一样url-pattern要和你想访问的url末端一致。

Servlet涉及的设计模式——————适配器设计模式

适配器?

比如说:电脑的电源适配。原本民用电220V,电脑用36V,可见电源的电压需要转化,转化的过程可能很复杂,电源适配器把这一个转化的复杂过程封装到一个小盒子里面

适配器:将一些复杂的功能集成起来,使你不再关注功能的复杂实现,复杂的细节被封装起来了

Servlet-->GenericServlet

Servlet涉及的设计模式------------------模板方法模式

为了专注不同情况做不同的判断,我们设计了模板设计模式,比如说HTTP请求分为很多方式:get、post、put、delete等等

每一种方法我们处理的代码不同

Servet-->GenericServlet---->HttpServlet

Servlet被访问的时候的顺序--------------时序图

自己尝试联系画一个时序图


3.

public class MyServlet extends GenericServlet{

	//这个类我们在使用的时候,只需要关注service方法
	//其他的问题都被适配器封装了
	//现在如果我想使用ServletConfig,this就是ServletConfig
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		res.getWriter().write("This is GenericServlet");	
	}
}
4.
/**
 * Servlet implementation class MyServletConfig
 */
//@WebServlet("/MyServletConfig")
public class MyServletConfig extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServletConfig() {
        super();
        // TODO Auto-generated constructor stub
    }
//    private ServletConfig config;
//    @Override
//    public void init(ServletConfig config) throws ServletException {
//    	// TODO Auto-generated method stub
//    	this.config=config;
//    }
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
//		String username=config.getInitParameter("username");
//		String password=config.getI:nitParameter("password");
//		String encoding=config.getInitParameter("encoding");
//              获取参数第一种
//		String username=getServletConfig().getInitParameter("username");
//		String password=getServletConfig().getInitParameter("password");
//		String encoding=getServletConfig().getInitParameter("encoding");
                //第二种
		String username=getInitParameter("username");
		String password=getInitParameter("password");
		String encoding=getInitParameter("encoding");
		response.getWriter().println("第三种方式:"+username+":"+password+":"+encoding);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
@WebServlet(
		description = "this is myServlet1", 
		urlPatterns = { "/MyServlet1" }, 
		initParams = { 
				//@WebInitParam(name = "username", value = "wangwu"), 
				//@WebInitParam(name = "password", value = "666666")
		})
public class MyServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public MyServlet1() {
	}
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		CheckLogin.doLogin(username, password);
		System.out.println(username);
		resp.getWriter().println(username);
	
		//getServletConfig().getInitParameter(username)
	
	}

	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		req.setCharacterEncoding("utf-8");
		String username= req.getParameter("username");
		String password= req.getParameter("password");
		String city= req.getParameter("city");
		String sex= req.getParameter("sex");
		String hobby[]= req.getParameterValues("hobby");
		System.out.println(username+password);
		//上述做法并不好,因为属性可能会改变,或者属性多一个就要改很累
		
		User user = new User();
		Map<String,String[]> map =req.getParameterMap();
		for (Map.Entry<String,String[]> m :map.entrySet()) {
			String name= m.getKey();
			String values[] = m.getValue();
			//使用反射User.class
			//属性描述器PropertyDescriptor
			//比如说获取User.class中的username成员
			//属性描述器描述其username的getUsername()和setUsername()
			try {
				PropertyDescriptor des =new PropertyDescriptor(name, User.class);
				//获取User类的对于name{username,password。。}的set方法
				Method me = des.getWriteMethod();
				//执行get方法
				
//				if(values.length==1){
//					//万一爱好只有一个,也是有问题
//					//获取me方法的所有参数类型
//					
//					Class<?> cls [] = me.getParameterTypes();
//					boolean bool = cls[0].isArray();
//					if(bool){
//						me.invoke(user,(Object) new String[] {values[0]});
//					}else{
//						me.invoke(user, values[0]);
//					}
//					
//				}else{
//					//难点、重点
//					//为什么要强转成Object
//					//对于me方法,参数可能是多个,于是第二个参数是一个数组
//					//当setHobby定义时,唯一的参数是数组,而不是很多个参数组成一个Object[]
//					//假设setHobby(String hobby1,String hobby2,String hobby3);
//					me.invoke(user, (Object)values);
//				}
				//最后版本
				Class<?> [] cls = me.getParameterTypes();
				boolean bool = cls[0].isArray();
				if(bool){
					me.invoke(user,(Object) new String[] {values[0]});
				}else{
					me.invoke(user, values[0]);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		
		}
		//System.out.println(user);
	
	}

}
 
 
@WebServlet({ "/MyServlet2", "/demo2" })
public class MyServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet2() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

	
		req.setCharacterEncoding("utf-8");
		User user = new User();
		Map<String ,String[]> map = req.getParameterMap();
		//使用beanutils工具类的populate
		try {
			BeanUtils.populate(user, map);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		System.out.println(user);
	
	
	}

}
 
 
@WebServlet({ "/RequestDemo3", "/demo3" })
public class RequestDemo3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestDemo3() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//使用inputStream()
		ServletInputStream in=request.getInputStream();
		int len=0;
		byte [] arr=new byte[1024];
		for (;(len=in.read(arr))!=-1;) {
			System.out.println(new String(arr,0,arr.length,"utf-8"));
			//urlencoder格式数据如下:
			//username=%E5%BC%A0%E9%A3%9E%E7%89%9B%E8%82%89&password=123456&sex=%E5%A5%B3&hobby=%E7%AF%AE%E7%90%83&hobby=%E7%BE%BD%E6%AF%9B%E7%90%83&city=%E5%B9%BF%E5%B7%9E
			//urldecoder可以把数据还原:
			//
			System.out.println(URLDecoder.decode(new String(arr,0,arr.length,"utf-8"),"utf-8"));
		}
		in.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

@WebServlet("/demo4")
public class RequestDemo4 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestDemo4() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//request.setCharacterEncoding(env);
		
		//Tomcat7.x中默认使用的字符编码是ISO-8859-1
		
		String username=request.getParameter("username");
		//此时是乱码,它是iso-8859-1
		System.out.println(username);
		
		//把乱码的数据还原成01010101的二进制状态
		byte [] arr=username.getBytes("ISO-8859-1");
		
		//把二进制状态的数据变为utf-8格式的数据
		username=new String(arr,"utf-8");
		
		//此时username就不乱码了
		System.out.println(username);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
@WebServlet("/demo5")
public class RequestDemo5 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestDemo5() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//请求转发:
		//发现转走了request,那么request中的参数也就随着转发过去了
		request.getRequestDispatcher("/demo1").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}








猜你喜欢

转载自blog.csdn.net/qq_41813207/article/details/80257922