什么是struts
struts是一筐经典的MVC框架
struts的请求流程
1.用户发送一个request,被ActionServlet拦截
2.ActionServlet根据struts-config.xml中的配置内容,将请求的参数传到对应的Formbean中,并设置session
3.根据请求中的action参数,再struts-config.xml中找到对应的Action(Controller)
4.根据Action的处理结果,会返回一个forward变量,此时通过mapping.findForward()查找出struts-config.xml对应的forward所标示的Action或者JSP页面,将请求转到下一个处理.如果是forward指向JSP页面,则输出到前台
怎么使用
1.在web.xml中配置ActionServlet
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2.配置struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- DTD是提示需要的配置信息 -->
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<!-- 配置表单 -->
<form-beans>
<!-- name是表单的名字,可以随意写,但是建议取名表单类名小写 -->
<!-- type用于指定表单类的全路径 -->
<form-bean name="userForm" type="com.crc.forms.UserForms"/>
</form-beans>
<global-exceptions />
<global-forwards />
<!-- 配置action -->
<action-mappings>
<!-- 配置具体的一个action path:表示将来访问该action的资源名 -->
<!-- name用于关联某个表单 -->
<!-- type用于指定该action类的全路径 -->
<!-- scope="request"表示该action对应的表单对象的访问范围-生命周期是request级别的 -->
<action path="/login" name="userForm" type="com.crc.actions.LoginAction">
<!-- 这里配置跳转关系 -->
<!-- name表示结果名称 path表示转发到哪个页面去 -->
<forward name="ok" path="/WEB-INF/ok.jsp"/>
<forward name="err" path="/WEB-INF/err.jsp"/>
</action>
</action-mappings>
<message-resources parameter="com.crc.struts.ApplicationResources" />
</struts-config>
3.下面用一个登陆流程示例
先配置jsp
<body>
<form action="/strutstools/login.do" method="post">
u:<input type="text" name="username"><br/>
p:<input type="password" name="password"><br/>
<input type="submit" value="login">
</form>
</body>
这里login.do会通过struts-config.xml找到要执行哪一个Action,如果提交数据存在表单,则通过struts-config.xml的
<action path="/login" name="userForm" type="com.crc.actions.LoginAction">
里面name=”userForm”找到struts-config.xml对应的form-bean name=”userForm”
<!-- 配置表单 -->
<form-beans>
<!-- name是表单的名字,可以随意写,但是建议取名表单类名小写 -->
<!-- type用于指定表单类的全路径 -->
<form-bean name="userForm" type="com.crc.forms.UserForms"/>
</form-beans>
通过Action里面的逻辑操作
public class LoginAction extends Action {
//我们需要重新编写一个方法:execute会被自动调用有点类似servlet的service/doget方法
//ActionMapping
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//return super.execute(mapping, form, request, response);
//取出表单数据
//AciontForm,把from转成对应的UserForm对象
UserForms userForm=(UserForms)form;
Session session=MySessionFactory.getSessionFactory().openSession();
Transaction ts=null;
try {
ts=session.beginTransaction();
List list = session.createQuery("select id ,email from Employe").list();
for (int i = 0; i < list.size(); i++) {
System.out.println("111=");
Object [] objs = (Object[]) list.get(i);
System.out.println("222="+list.toString());
System.out.println("222="+objs[0].toString());
System.out.println("222="+objs[1].toString());
}
ts.commit();
} catch (Exception e) {
// TODO: handle exception
if (ts!=null) {
System.out.println("1111");
ts.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
session.close();
}
if (userForm.getPassword().equals("123")) {
request.setAttribute("username", userForm.getUsername());
return mapping.findForward("ok");
}else{
return mapping.findForward("err");
}
}
}
mapping.findForward(“ok”);返回的ok,在struts-config.xml找到对应的界面
<forward name="ok" path="/WEB-INF/ok.jsp"/>
在这个路径下找到jsp界面,返回给用户
4.处理页面乱码问题
先在web.xml配置一个自定义filter
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>com.crc.filters.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
再写一个filter类
@WebFilter("/MyFilter1")
public class MyFilter1 implements Filter {
/**
* Default constructor.
*/
public MyFilter1() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
//chain.doFilter(request, response);
//这里设置接收编码
request.setCharacterEncoding("utf-8");
//response.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
response.setContentType("text/html;charset=utf-8");
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
通过注解方式配置,拦截所有的请求,处理页面乱码