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); } }