struts2:入门
1、概念:mvc
1、配置一个servlet,在web.xml中需要些很多行代码,这样的写法在团队的合作中不可取
2、在servlet中,doGet和doPost方法有两个参数:request,response,这两个参数具有严重的容器依赖性,所以不便于测试
3、在一个servlet中写很多方法,怎么样去调用
4、在servlet中完成所有的逻辑,结构不好,例如用户注册的例子:
用户注册:
1、获取表单的数据
2、完成图片的上传
3、完成校验
4、完成验证码
5、保存用户
5、request获取页面表单的数据太麻烦了
6、url处理起来比较费劲
处理的方法:可以参照之前写过的用注解的形式反射,来实现配置一个过滤器拦截所有请求,
根据uri的参数来反射调用相应的方法的形式来解决。
对servlet进行重构:
1、在web.xml中写一个过滤器
1、利用java的反射机制调用所有的service
2、把request,response的参数传递到service层
3、response过程
2、在servlet中利用java的反射机制动态的调用service层的方法
3、对错误处理机制进行重构
例:在web服务器启动时,扫描所有的action 加载进一个容器中。
这时:当客户端反问http://localhost:8080/itheima_servlet/userService.add
过滤器对请求进行拦截:
ServletFileter{
doPost(){
1.获得url中的userService
2.获取url中的方法名称add
3.把userService所在的类的全名取出来
4.method.invoke(userService,res,req)将service对象和请求响应对象以参数的形式带过去。
进入自己编写的action中实现业务逻辑。
重构servlet的总结:
1、service的方法做到了动态的调用
以上的只是解决了一部分的问题,只是方便对于struts2的理解。
struts2:
1.struts的配置:
struts2的核心是用一个过滤器拦截所有的请求:
在web.xml中:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、导入jar 包。
4、 在src folder的根目录下创建::: struts.xml。
<result name="index">index.jsp</result>
</action>
</package>
1、struts2的配置文件是以包的形式进行管理的,包和包之间可以继承,来实现拦截器等功能。
继承的根包必须是继承struts-default的
。
2、package中的name是包的唯一的标示,与id特性一样,不可以有重复。
3、namespace 命名空间:一般情况下默认为web工程根目录:
4、extends 继承: 一定要填写struts-default。
5、<action>标签定义的就是action的注册信息。
<action name="userAction" method="add" class="cn.itheima03.struts2.action.UserAction">
这里一一对应的是:
name=userAction::定义方法的访问名称:
例:http://loacalhost:8080/itheima03/userAction.action 这里的工程目录下的userAction和name的属性必须保持一致。
method=add:定义访问该action的方法名称。
class该类的完整名称,用其反射。
6、result代表结果集: name="就是action中的方法的返回值,必须一致。"
result中间的index.jsp意义是:当返回此结果时跳转到index.jsp页面。
需要注意的是:这里的跳转是转发而不是重定向。
5、创建一个bean,为UserAction
* UserAction的方法必须返回一个字符串(该方法可以继承actionSupport等或实现某些接口复写execute()方法等操作。默认什么也不继承也可以操作)
整个的执行流程:
客户端访问http://loacalhost:8080/itheima03/userAction.action
服务器端进行过滤器拦截:解析配置文件,寻找userAction 反射出该类实例。调用add方法,完成业务逻辑,该方法返回一个字符串。
在配置文件中的result结果集中寻找与方法返回的字符串相同的name属性,然后根据其配置的标签体index.jsp将之返回给客户端。
1、概念:mvc
2、servlet的缺点
1、配置一个servlet,在web.xml中需要些很多行代码,这样的写法在团队的合作中不可取
2、在servlet中,doGet和doPost方法有两个参数:request,response,这两个参数具有严重的容器依赖性,所以不便于测试
3、在一个servlet中写很多方法,怎么样去调用
4、在servlet中完成所有的逻辑,结构不好,例如用户注册的例子:
用户注册:
1、获取表单的数据
2、完成图片的上传
3、完成校验
4、完成验证码
5、保存用户
5、request获取页面表单的数据太麻烦了
6、url处理起来比较费劲
处理的方法:可以参照之前写过的用注解的形式反射,来实现配置一个过滤器拦截所有请求,
根据uri的参数来反射调用相应的方法的形式来解决。
对servlet进行重构:
1、在web.xml中写一个过滤器
1、利用java的反射机制调用所有的service
2、把request,response的参数传递到service层
3、response过程
2、在servlet中利用java的反射机制动态的调用service层的方法
3、对错误处理机制进行重构
例:在web服务器启动时,扫描所有的action 加载进一个容器中。
这时:当客户端反问http://localhost:8080/itheima_servlet/userService.add
过滤器对请求进行拦截:
ServletFileter{
doPost(){
1.获得url中的userService
2.获取url中的方法名称add
3.把userService所在的类的全名取出来
4.method.invoke(userService,res,req)将service对象和请求响应对象以参数的形式带过去。
进入自己编写的action中实现业务逻辑。
重构servlet的总结:
1、service的方法做到了动态的调用
2、因为所有的service方法都在一个filter中动态的调用,所以只要service的方法中出现错误,就可以错误统一
的处理
3、在web.xml中声明了一个总控的过滤器,使得在web.xml中的配置大量减少了
以上的只是解决了一部分的问题,只是方便对于struts2的理解。
struts2:
运行原理图:
1.struts的配置:
struts2的核心是用一个过滤器拦截所有的请求:
在web.xml中:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
3、导入jar 包。
4、 在src folder的根目录下创建::: struts.xml。
* 根元素为struts
<package name="user" namespace="/" extends="struts-default">
<action name="userAction" method="add" class="cn.itheima03.struts2.action.UserAction">
<result name="index">index.jsp</result>
</action>
</package>
1、struts2的配置文件是以包的形式进行管理的,包和包之间可以继承,来实现拦截器等功能。
继承的根包必须是继承struts-default的
。
2、package中的name是包的唯一的标示,与id特性一样,不可以有重复。
3、namespace 命名空间:一般情况下默认为web工程根目录:
4、extends 继承: 一定要填写struts-default。
5、<action>标签定义的就是action的注册信息。
<action name="userAction" method="add" class="cn.itheima03.struts2.action.UserAction">
这里一一对应的是:
name=userAction::定义方法的访问名称:
例:http://loacalhost:8080/itheima03/userAction.action 这里的工程目录下的userAction和name的属性必须保持一致。
method=add:定义访问该action的方法名称。
class该类的完整名称,用其反射。
6、result代表结果集: name="就是action中的方法的返回值,必须一致。"
result中间的index.jsp意义是:当返回此结果时跳转到index.jsp页面。
需要注意的是:这里的跳转是转发而不是重定向。
5、创建一个bean,为UserAction
* UserAction的方法必须返回一个字符串(该方法可以继承actionSupport等或实现某些接口复写execute()方法等操作。默认什么也不继承也可以操作)
整个的执行流程:
客户端访问http://loacalhost:8080/itheima03/userAction.action
服务器端进行过滤器拦截:解析配置文件,寻找userAction 反射出该类实例。调用add方法,完成业务逻辑,该方法返回一个字符串。
在配置文件中的result结果集中寻找与方法返回的字符串相同的name属性,然后根据其配置的标签体index.jsp将之返回给客户端。